2 Punkte von GN⁺ 2024-02-10 | 1 Kommentare | Auf WhatsApp teilen

GrafanaCON 2024: Jetzt anmelden und Platz sichern!

  • Die GrafanaCON 2024 ist das größte Community-Event des Jahres, und die Anmeldung hat offiziell begonnen.
  • Die Veranstaltung bietet im April in Amsterdam ein lebendiges Erlebnis vor Ort.

Meinung von GN⁺

  • Die GrafanaCON 2024 ist ein wichtiges Event für alle, die sich für Datenvisualisierung und Monitoring interessieren. Die Veranstaltung wird ein Ort sein, an dem die Grafana-Nutzer- und Entwickler-Community zusammenkommt, um die neuesten Trends und Technologien zu teilen.
  • Das Event in Amsterdam bietet den Teilnehmenden Gelegenheiten zum Networking und Lernen; zudem werden voraussichtlich Sessions angeboten, die ein vertieftes Verständnis von Datenanalyse- und Visualisierungstools fördern.
  • Der Start der Anmeldung ist eine spannende Nachricht für Grafana-Nutzer und eine gute Gelegenheit für Fachleute in diesem Bereich, neues Wissen zu erwerben und sich mit Kolleginnen und Kollegen aus der Branche auszutauschen.

1 Kommentare

 
GN⁺ 2024-02-10
Hacker-News-Kommentare
  • The Valid method takes a context (which is optional but has been useful for me in the past) and returns a map. If there is a problem with a field, its name is used as the key, and a human-readable explanation of the issue is set as the value.

    • Methode zur Validierung: Nimmt einen optionalen Kontext entgegen und gibt eine Map zurück, bei der problematische Felder als Schlüssel und menschenlesbare Problembeschreibungen als Werte verwendet werden. Es wird erwähnt, dass sich dieser Ansatz in der Vergangenheit als nützlich erwiesen hat.
  • I used to do this, but ever since reading Lexi Lambda's "Parse, Don't Validate," I've found validators to be much more error-prone than leveraging Go's built-in type checker.

    • Parsen statt validieren: Nach der Lektüre von Lexi Lambdas "Parse, Don't Validate" empfindet der Kommentator die Nutzung des eingebauten Type-Checkers von Go als weniger fehleranfällig als klassische Validatoren.
  • For example, imagine you wanted to defend against the user picking an illegal username. Like you want to make sure the user can't ever specify a username with angle brackets in it.

    • Beispiel für die Validierung eines Benutzernamens: Es wird der Fall beschrieben, dass verhindert werden soll, dass Nutzer einen unzulässigen Benutzernamen mit spitzen Klammern wählen.
  • With the Validator approach, you have to remember to call the validator on 100% of code paths where the username value comes from an untrusted source.

    • Problem des Validator-Ansatzes: Für jeden einzelnen Codepfad, auf dem ein Benutzername aus einer nicht vertrauenswürdigen Quelle stammt, muss zuverlässig der Validator aufgerufen werden.
  • Instead of using a validator, you can do this:

    • Vorgeschlagene Alternative zur Validierung: Statt eines Validators wird ein anderer Ansatz vorgeschlagen.
  • That guarantees that you can never forget to validate the username through any codepath. If you have a Username object, you know that it was validated because there was no other way to create the object.

    • Garantierte Validierung über Objekterzeugung: Wenn ein Username-Objekt existiert, ist klar, dass es validiert wurde, weil es keinen anderen Weg gibt, dieses Objekt zu erzeugen.
  • I really like Mat Ryer's work, and I've applied most of the ideas in the 2018 version of this article to all of my Go projects since then.

    • Wertschätzung für Mat Ryers Arbeit: Der Kommentator schätzt Mat Ryers Arbeit sehr und hat seitdem die meisten Ideen aus der Version des Artikels von 2018 in seinen Go-Projekten angewendet.
  • The one weak spot for me is this aspect:

    • Benennung eines Schwachpunkts: Ein bestimmter Aspekt wird als Schwachstelle hervorgehoben.
  • This has always felt wrong to me, but I've never been able to figure out a better solution.

    • Fehlende bessere Lösung: Es fühlt sich schon lange falsch an, aber eine bessere Lösung wurde bisher nicht gefunden.
  • It means that a huge chunk of your code has a huge amount of unnecessary shared state.

    • Problem mit gemeinsam genutztem Zustand: Große Teile des Codes tragen dadurch unnötig viel gemeinsam genutzten Zustand mit sich.
  • I often end up writing HTTP handlers that only need access to a tiny amount of the shared state.

    • HTTP-Handler und Shared State: Häufig benötigen HTTP-Handler nur einen sehr kleinen Teil dieses gemeinsam genutzten Zustands.
  • Nothing against Mat Ryer, as his pattern is the best I've found, but I still feel like there's some better solution out there.

    • Respekt für Mat Ryers Muster: Obwohl sein Muster das beste bislang gefundene ist, bleibt das Gefühl, dass es noch eine bessere Lösung geben müsste.
  • one of my biggest pet peeves is when people take a Config object, which represents the configuration of an entire system, and pass it around mutably.

    • Kritik an der Nutzung von Config-Objekten: Es wird stark kritisiert, wenn ein Config-Objekt für das gesamte System veränderlich durchgereicht wird.
  • When you do that, you're coupling everything together through the config object.

    • Kopplung über das Config-Objekt: Dadurch werden alle Komponenten über das Config-Objekt eng miteinander gekoppelt.
  • I've worked on systems where you had to configure the parts in a specific order in order for things to work, because someone decided to write back to the config object when it was passed to them.

    • Reihenfolgeabhängigkeiten durch Config: Es wird von Systemen berichtet, in denen Teile in einer bestimmten Reihenfolge konfiguriert werden mussten, weil jemand beim Weiterreichen zurück in das Config-Objekt schrieb.
  • Or another case was where I've seen it such that you couldn't disable a portion of the system because it wrote data into the config object that was read by some other subsystem later.

    • Probleme beim Deaktivieren von Systemteilen: Es wurden Fälle erlebt, in denen ein Systemteil nicht deaktiviert werden konnte, weil er Daten in das Config-Objekt schrieb, die später ein anderes Subsystem auslas.
  • The pattern of "your configuration is one big value, which is mutable" is one of the more annoying patterns that I've seen before, both in Go and in other languages.

    • Kritik an einem großen veränderlichen Konfigurationswert: Das Muster „eine große, veränderliche Konfiguration“ wird in Go wie auch in anderen Sprachen als besonders lästig empfunden.
  • I agree with a lot of this, I'll add my own opinions:

    • Zustimmung und Ergänzungen: Vieles davon findet Zustimmung, ergänzt um eigene Ansichten.
  • I would pass a waitgroup with the app context to service structs.

    • Vorschlag zu WaitGroup und App-Kontext: Es wird empfohlen, Service-Structs eine WaitGroup zusammen mit dem App-Kontext zu übergeben.
  • This way the interrupt can trigger the app shutdown via the context and the main goroutine can wait on the waitgroup before actually killing the app.

    • Nutzung von Interrupt und WaitGroup für Shutdown: So kann ein Interrupt über den Kontext das Herunterfahren auslösen, und die Haupt-Goroutine kann vor dem tatsächlichen Beenden auf die WaitGroup warten.
  • If writing a CLI program, then testing stdout, stdin, stderr, args, env, etc. is useful.

    • Nützlichkeit von CLI-Tests: Bei CLI-Programmen ist das Testen von stdout, stdin, stderr, args, env usw. sinnvoll.
  • But for an http server, this is less true.

    • Anderer Ansatz bei HTTP-Servern: Für einen HTTP-Server gilt das jedoch weniger.
  • I would pass structured config to the run function to let those tests be more focused.

    • Fokussiertere Tests durch strukturierte Konfiguration: Es wird vorgeschlagen, der run-Funktion strukturierte Konfiguration zu übergeben, um Tests gezielter zu gestalten.
  • I disagree with parsing templates using sync.Once in a handler because I don't think handlers should do template parsing at all.

    • Ablehnung von Template-Parsing im Handler: Der Kommentator ist dagegen, Templates per sync.Once im Handler zu parsen, da Handler seiner Ansicht nach überhaupt kein Template-Parsing übernehmen sollten.
  • I would do this when the app starts: if the template cannot be parsed, the app should not become ready to receive any requests and should rather exit with a non-zero exit code.

    • Template-Parsing beim Start der App: Das Parsing sollte beim Start erfolgen; wenn ein Template nicht geparst werden kann, sollte die App keine Anfragen annehmen und stattdessen mit einem Exit-Code ungleich null beendet werden.
  • I found fx to be a super simple yet versatile tool to design my application around.

    • Einfachheit und Vielseitigkeit von fx: fx wird als sehr einfaches und zugleich vielseitiges Werkzeug für das Anwendungsdesign beschrieben.
  • All the advice in the article is still helpful, but it takes the "how do I make sure X is initialized when Y needs it" part completely out of the equation and reduces it from an N*M problem to an N problem.

    • Nutzen von fx zusätzlich zum Artikel: Die Hinweise im Artikel bleiben hilfreich, aber fx eliminiert die Frage „Wie stelle ich sicher, dass X initialisiert ist, wenn Y es braucht?“ und reduziert sie von einem N*M- auf ein N-Problem.
  • I've used quite a few dependency injection libraries in various languages over the years (and implemented a couple myself) and the simplicity and versatility of fx makes it my favorite so far.

    • Bevorzugung von fx: Trotz Erfahrung mit vielen Dependency-Injection-Bibliotheken in verschiedenen Sprachen und einigen Eigenimplementierungen ist fx wegen seiner Einfachheit und Vielseitigkeit bisher der Favorit.
  • I've recently been playing with ogen:

    • Erfahrungen mit ogen: Kürzlich wurde mit ogen experimentiert.
  • Write openapi definition, it'll do routing, definition of structs, validation of JSON schemas, etc.

    • Funktionen von ogen mit OpenAPI: Man schreibt eine OpenAPI-Definition, und ogen übernimmt Routing, Struct-Definitionen, die Validierung von JSON-Schemas und mehr.
  • All I need to do is implement the service.

    • Vereinfachte Service-Implementierung: Es muss nur noch der Service selbst implementiert werden.
  • Validating an integer range for a querystring parameter is just too boring. And too easy to mistype when writing it manually.

    • Nachteile manueller Bereichsvalidierung: Die Validierung eines Integer-Bereichs für Query-String-Parameter ist langweilig und bei manueller Umsetzung leicht fehleranfällig.
  • Anyways, so far only been playing, so haven't found the bad parts yet.

    • Vorläufige Einschätzung zu ogen: Bisher wurde nur damit experimentiert, deshalb sind mögliche Schwächen noch nicht aufgefallen.
  • Great article with lots of interesting ideas. Can't believe I didn't know about signal.NotifyContext. Finally I'll be able to actually rememeber how to respond to signals instead of copy-pasting that between projects.

    • Positive Einschätzung zu Artikel und signal.NotifyContext: Der Artikel wird als hervorragend und ideenreich gelobt, und die Entdeckung von signal.NotifyContext wird als sehr hilfreich empfunden, um das Reagieren auf Signale nicht mehr projektübergreifend per Copy-and-paste lösen zu müssen.
  • I like a lot of what they've done here. My testing looks a bit different however.

    • Gefallen am Ansatz, aber andere Testpraxis: Vieles am gezeigten Ansatz gefällt, auch wenn die eigene Testpraxis etwas anders aussieht.
  • srv, err := newTestServer()

    • Beispielcode zum Erzeugen eines Testservers: Es wird ein Beispiel zum Starten eines neuen Testservers gezeigt.
  • require.NoError(t, err)

    • Beispielcode zur Fehlerprüfung: Es wird ein Beispiel für die Prüfung gezeigt, dass kein Fehler aufgetreten ist.
  • defer srv.Close()

    • Beispielcode zum Schließen des Servers: Es wird gezeigt, wie der Server nach dem Test wieder geschlossen wird.
  • resp, err := http.Post(fmt.Sprintf("http://localhost:%d/signup/json";, srv.Port()), "application/json", strings.NewReader({ "email": "test@example.com", "password": "p@55Word", "password_copy": "p@55Word" }))

    • Beispielcode für eine HTTP-POST-Anfrage: Es wird ein Beispiel für das Senden einer HTTP-POST-Anfrage gezeigt.
  • In my newTestServer, I spin up a server with fakes for my dependencies.

    • Testserver mit Fakes für Abhängigkeiten: Im newTestServer wird ein Server mit Fake-Implementierungen der Abhängigkeiten gestartet.
  • If I want to test a dependency error, I replace that property with a fake that will return an error.

    • Testen von Abhängigkeitsfehlern: Um einen Fehler in einer Abhängigkeit zu testen, wird die betreffende Eigenschaft durch ein Fake ersetzt, das einen Fehler zurückgibt.
  • I can validate my error paths. I can validate my log entries. I can validate my metric emission. I can validate timeouts and graceful shutdowns.

    • Vielfältige Testmöglichkeiten: So lassen sich Fehlerpfade, Log-Einträge, die Ausgabe von Metriken, Timeouts und Graceful Shutdowns überprüfen.
  • After the server starts, I inspect to determine which port it is running on (default is :0 so I have to wait to see what it got bound to).

    • Port-Prüfung nach dem Serverstart: Nach dem Start wird geprüft, auf welchem Port der Server läuft; standardmäßig ist es :0, daher muss erst abgewartet werden, woran tatsächlich gebunden wurde.
  • My "unit" tests can test at the handler level or the http level, making sure that I can fully test the code as the users of my system will see it, exercising all middleware or none.

    • Umfang der „Unit“-Tests: Die „Unit“-Tests können auf Handler- oder HTTP-Ebene laufen, sodass der Code so getestet wird, wie Nutzer des Systems ihn sehen, mit allen Middleware-Komponenten oder ganz ohne.
  • I can spin up N instances and run my tests in parallel.

    • Parallele Testausführung: Es können N Instanzen gestartet und Tests parallel ausgeführt werden.
  • I don't write go, but I like these patterns. Feels fairly universal for testable code.

    • Vorliebe für die Muster trotz fehlender Go-Praxis: Auch ohne selbst Go zu schreiben, gefallen diese Muster, weil sie für gut testbaren Code ziemlich universell wirken.