2 points par GN⁺ 2024-02-10 | 1 commentaires | Partager sur WhatsApp

GrafanaCON 2024 : inscrivez-vous dès aujourd’hui et réservez votre place !

  • GrafanaCON 2024 est le plus grand événement communautaire de l’année, et les inscriptions sont désormais officiellement ouvertes.
  • L’événement offrira en avril une expérience immersive en présentiel à Amsterdam.

L’avis de GN⁺

  • GrafanaCON 2024 est un événement important pour les personnes qui s’intéressent à la visualisation de données et au monitoring. Il réunira la communauté des utilisateurs et des développeurs de Grafana pour partager les dernières tendances et technologies.
  • Cette édition organisée à Amsterdam offrira aux participants des occasions de réseautage et d’apprentissage, et l’on peut s’attendre à des sessions qui aideront à mieux comprendre les outils d’analyse et de visualisation des données.
  • L’ouverture des inscriptions est une nouvelle enthousiasmante pour les utilisateurs de Grafana, et une excellente occasion pour les professionnels du secteur d’acquérir de nouvelles connaissances et d’échanger avec leurs pairs.

1 commentaires

 
GN⁺ 2024-02-10
Commentaires sur Hacker News
  • 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.

    • Méthode de validation : elle prend un contexte optionnel et renvoie une map dont les clés sont les champs problématiques et les valeurs une explication lisible du problème. L’auteur précise que cette approche lui a déjà été utile.
  • 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.

    • Parser plutôt que valider : après avoir lu « Parse, Don't Validate » de Lexi Lambda, il estime que s’appuyer sur le vérificateur de types intégré de Go est moins sujet aux erreurs que d’utiliser des validateurs.
  • 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.

    • Exemple de validation de nom d’utilisateur : il imagine le cas où l’on veut empêcher un utilisateur de choisir un nom d’utilisateur invalide, par exemple contenant des chevrons.
  • 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.

    • Limite de l’approche par validateur : il faut penser à appeler le validateur sur 100 % des chemins de code où la valeur du nom d’utilisateur provient d’une source non fiable.
  • Instead of using a validator, you can do this:

    • Alternative au validateur : il propose une autre méthode au lieu d’utiliser un validateur.
  • 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.

    • Validation garantie par la création de l’objet : la validation a lieu lors de la création de l’objet Username, ce qui empêche de l’oublier quel que soit le chemin de code. Si l’on possède un objet Username, on sait qu’il a été validé puisqu’il n’existe pas d’autre moyen de le créer.
  • 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.

    • Appréciation du travail de Mat Ryer : il apprécie beaucoup le travail de Mat Ryer et applique depuis la plupart des idées de la version 2018 de cet article à tous ses projets Go.
  • The one weak spot for me is this aspect:

    • Point faible signalé : il mentionne un aspect qui lui semble problématique.
  • This has always felt wrong to me, but I've never been able to figure out a better solution.

    • Absence de meilleure solution : cela lui a toujours semblé mauvais, sans qu’il ait réussi à trouver une meilleure solution.
  • It means that a huge chunk of your code has a huge amount of unnecessary shared state.

    • Problème d’état partagé : une grande partie du code se retrouve avec une quantité importante d’état partagé inutile.
  • I often end up writing HTTP handlers that only need access to a tiny amount of the shared state.

    • Handlers HTTP et état partagé : il écrit souvent des handlers HTTP qui n’ont besoin que d’une toute petite partie de cet état partagé.
  • 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.

    • Respect pour le pattern de Mat Ryer : sans rien reprocher à Mat Ryer, dont le pattern est le meilleur qu’il ait trouvé, il a tout de même le sentiment qu’une meilleure solution existe.
  • 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.

    • Agacement face à l’objet Config : il déplore particulièrement le fait de faire circuler de manière mutable un objet Config qui représente la configuration de tout un système.
  • When you do that, you're coupling everything together through the config object.

    • Couplage via l’objet Config : cette pratique couple tous les éléments entre eux à travers l’objet Config.
  • 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.

    • Dépendance à l’ordre de configuration : il a déjà travaillé sur des systèmes où il fallait configurer les composants dans un ordre précis pour que tout fonctionne, parce qu’une personne avait décidé de réécrire dans l’objet Config qui lui était passé.
  • 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.

    • Impossible de désactiver une partie du système : il a aussi vu des cas où une partie du système ne pouvait pas être désactivée parce qu’elle écrivait des données dans l’objet Config, ensuite lues par un autre sous-système.
  • 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.

    • Critique d’une grosse configuration mutable : il juge très agaçant le pattern consistant à avoir « une seule grosse valeur de configuration, mutable », aussi bien en Go que dans d’autres langages.
  • I agree with a lot of this, I'll add my own opinions:

    • Accord général et ajout personnel : il est d’accord avec une bonne partie de l’article et ajoute ses propres remarques.
  • I would pass a waitgroup with the app context to service structs.

    • Proposition avec waitgroup et contexte applicatif : il propose de passer un waitgroup avec le contexte de l’application aux structs de service.
  • 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.

    • Arrêt de l’application via interruption et waitgroup : ainsi, une interruption peut déclencher l’arrêt de l’application via le contexte, et la goroutine principale peut attendre le waitgroup avant de réellement arrêter l’application.
  • If writing a CLI program, then testing stdout, stdin, stderr, args, env, etc. is useful.

    • Utilité des tests pour un programme CLI : dans un programme CLI, tester stdout, stdin, stderr, args, env, etc. est utile.
  • But for an http server, this is less true.

    • Approche différente pour un serveur HTTP : pour un serveur HTTP, cela est moins pertinent.
  • I would pass structured config to the run function to let those tests be more focused.

    • Configuration structurée pour des tests ciblés : il recommande de passer une configuration structurée à la fonction run afin de rendre les tests plus ciblés.
  • I disagree with parsing templates using sync.Once in a handler because I don't think handlers should do template parsing at all.

    • Désaccord sur le parsing de templates dans un handler : il n’est pas d’accord avec l’idée d’utiliser sync.Once pour parser des templates dans un handler, car selon lui les handlers ne devraient pas faire de parsing de templates du tout.
  • 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.

    • Parsing des templates au démarrage : il ferait ce parsing au démarrage de l’application ; si le template ne peut pas être parsé, l’application ne devrait pas se déclarer prête à recevoir des requêtes et devrait quitter avec un code de sortie non nul.
  • I found fx to be a super simple yet versatile tool to design my application around.

    • Simplicité et polyvalence de fx : il considère fx comme un outil extrêmement simple et pourtant polyvalent pour structurer son application.
  • 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.

    • Intérêt de fx par rapport à l’article : tous les conseils de l’article restent utiles, mais fx élimine complètement la question « comment s’assurer que X est initialisé quand Y en a besoin ? » et transforme un problème en N*M en un problème en N.
  • 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.

    • Préférence pour fx : après avoir utilisé de nombreuses bibliothèques d’injection de dépendances dans divers langages au fil des années, et même en avoir implémenté quelques-unes, il dit que la simplicité et la polyvalence de fx en font sa favorite jusqu’à présent.
  • I've recently been playing with ogen:

    • Expérimentation avec ogen : il a récemment commencé à tester ogen.
  • Write openapi definition, it'll do routing, definition of structs, validation of JSON schemas, etc.

    • Fonctionnalités d’ogen à partir d’OpenAPI : il suffit d’écrire une définition OpenAPI et ogen se charge du routage, de la définition des structs, de la validation des schémas JSON, etc.
  • All I need to do is implement the service.

    • Implémentation simplifiée du service : il n’a plus qu’à implémenter le service.
  • Validating an integer range for a querystring parameter is just too boring. And too easy to mistype when writing it manually.

    • Inconvénient de la validation manuelle des paramètres de query string : valider une plage d’entiers pour un paramètre de query string est trop fastidieux et trop facile à mal saisir lorsqu’on l’écrit à la main.
  • Anyways, so far only been playing, so haven't found the bad parts yet.

    • Première impression sur ogen : pour l’instant, il ne fait qu’expérimenter et n’a pas encore trouvé les mauvais côtés.
  • 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.

    • Avis positif sur l’article et signal.NotifyContext : il trouve l’article excellent et riche en idées intéressantes, et n’en revient pas de ne pas avoir connu signal.NotifyContext plus tôt. Il pourra enfin se souvenir de la bonne façon de réagir aux signaux au lieu de copier-coller ce code d’un projet à l’autre.
  • I like a lot of what they've done here. My testing looks a bit different however.

    • Appréciation de l’approche mais tests différents : il aime beaucoup ce qui est présenté ici, même si sa manière de tester est un peu différente.
  • srv, err := newTestServer()

    • Exemple de création d’un serveur de test : il donne un exemple de code créant un nouveau serveur de test.
  • require.NoError(t, err)

    • Exemple de vérification d’erreur : il montre un exemple de vérification de l’absence d’erreur.
  • defer srv.Close()

    • Exemple de fermeture du serveur : il montre comment fermer le serveur à la fin du test.
  • 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" }))

    • Exemple de requête HTTP POST : il donne un exemple d’envoi d’une requête HTTP POST.
  • In my newTestServer, I spin up a server with fakes for my dependencies.

    • Serveur de test avec dépendances simulées : dans son newTestServer, il démarre un serveur avec des faux objets pour ses dépendances.
  • If I want to test a dependency error, I replace that property with a fake that will return an error.

    • Test des erreurs de dépendances : s’il veut tester une erreur de dépendance, il remplace cette propriété par un faux objet qui renverra une erreur.
  • 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.

    • Multiples possibilités de validation : il peut valider les chemins d’erreur, les entrées de logs, l’émission des métriques, les timeouts et les arrêts gracieux.
  • 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).

    • Inspection du port après démarrage : après le démarrage du serveur, il vérifie sur quel port il tourne ; comme la valeur par défaut est :0, il doit attendre pour voir à quel port il a été lié.
  • 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.

    • Portée des tests « unitaires » : ses tests « unitaires » peuvent s’exécuter au niveau du handler ou au niveau HTTP, ce qui lui permet de tester complètement le code tel que les utilisateurs du système le verront, avec tout le middleware ou sans aucun.
  • I can spin up N instances and run my tests in parallel.

    • Exécution parallèle des tests : il peut démarrer N instances et lancer ses tests en parallèle.
  • I don't write go, but I like these patterns. Feels fairly universal for testable code.

    • Appréciation de patterns universels : il n’écrit pas en Go, mais il aime ces patterns, qui lui paraissent assez universels pour produire du code testable.