Disclamer
A l’heure ou j’écris cet article, le code source d’OpenTelemetry et Signoz sont en alpha/beta/pre-release.
Certaine lib sont en release officielle.
J’édite au fur et à mesure certaine infos. Le code évolue et cet article aussi.
Il n’est certainement plus « à la page » lorsque vous lirez ces ligne.
Et de même, la doc officielle, celle de Microsoft et les ReadMe des repos ne sont pas tous mis à jours en temps et en heure.
C’est un sujet chaud pattate !!!
Besoins
Comme d’habitude, j’écris un article avec un vrai besoin et une application dans la vraie vie.
J’ai un serveur en prod et je souhaite le monitorer pour :
- observer son comportement (nombre de requêtes, % de CPU/RAM/Disk, periode d’activité/repos etc)
- analyser des problèmes, avoir accès aux logs sans ouvrir un terminal
- être alerté en cas de problème et pouvoir définir ces alertes
- avoir une vue d’ensemble avec des KPI de base
Contexte
Depuis peu (qq années) on a la possibilité de faire tourner du .net sous linux. Ca change quoi allez vous me dire ?
Personnelement une question de coût. Un VPS (virual private server) sous linux c’est au moins deux fois moins cher que sous Windows (ça dépend avec quel fournisseur et les prix ont aussi évolué dans le temps). Mais aujourd’hui un VPS linux est utlra compétitif. Et j’ai pas de besoin cloud (même si j’y pense).
Avec Windows on était habitué à installer des outils graphiques supplémentaires. Et meme de base on avait des outils de monitoring. Sous linux, c’est moins évident car on utilise principalement la ligne de commande. Et personnellement j’y retrouve pas mon compte. Même si on peut aussi mettre une interface graphique, c’est pas le but d’un serveur. Enfin, je voudrais pouvoir consulter ceci sans me loguer en ssh (depuis une interface web) et avoir des alertes email et sms serait top.
Actuellement je développe un nouveau produit (https://outquest.fr). Celui ci comporte un site web (game) et un site backoffice (qg). Le site officiel (outquest.fr) et le shop sont hébergés ailleurs (planethoster). J’ai une prod et un staging. (donc 4 site webs au final).
J’ai commencé avec un serveur low cost à 2.99€/mois (Debian, 1 core, 2 Go Ram, 25Go SSD …) chez Ikoula.
Franchement à ce prix la, ça marche bien pour faire tourner 4 sites webs.(avec que moi dessus hein !)
Ces 4 sites web tournent sous 4 services kernel (autorestart) linux et géré par un serveur web frontal NGinx.
–> pour la config voir cet article
J’ai de plus une CI/CD géré par azure devops (voir article Azure Devops) qui me permet via des pipelines de deployer automatiquement mon code sur les serveurs web respectif à chaque push git sur mes branches dev et master.
Ca a dla gueule ! Pour un mec tout seul (pour le moment) je sors la grosse artillerie. J’aurais pu partir direct avec un site web en prod et debuger dessus à l’ancienne. Mais j’aime bien apprendre à faire les choses bien :).
Et justement, pour faire bien, la prochaine étape c’est le monitoring des serveurs (ya aussi les backups, je pense que j’en ferai un article à part).
Du coup j’ai voulu tester une solution qui me paraissait pas mal, un APM (Application Performance Management) : CheckMK.
Le souci c’est que j’ai vu trop gros (ce machin permet de gérer tout un parc informatique, plusieurs serveurs, node, kubernetes…) Et en l’installation, le machin à fait fondre mon serveur. Plus moyen d’y accéder pendant un temps et pas moyen de le redémarrer (j’ai contacté le support, ce qui m’a pris plusieurs jours, à ce prix la fallait pas attendre des miracles.) Le bon moment pour passer à un niveau supérieur.
A ce stade j’avais ma prod et mon staging sur la meme petite bécanne. Du coup je me dis qu’il faudra quand meme passer sur qq chose de plus sérieux pour la prod. J’ai donc opté pour un VPS OMGServ avec cette config :
Et une option payante supplémentaire de backup. (snapshots)
CheckMK tourne déjà beaucoup mieux, mais comme je le disais c’est pas une solution pour moi. Ca install une bardé de trucs dont Apache2, qui fout la merde avec mon Nginx.
Après qq recherches, je suis tombé sur Signoz et OpenTelemetry. Et c’est ce qu’il me faut !
Signoz
Signoz est une interface web permettant de visualiser un ensemble de données sur votre serveur linux.
C’est une solution Open Source, récente et encore en dev. C’est un concurrent à DataDog (payant).
Elle permet de monitorer des applications et de fournir des éléments pertinents pour les devops.
Cette solution naît d’un constat. Les équipes techniques sont frustrées d’utiliser pleins d’outils différents provenants de sources de données elles aussi différentes pour voir leurs logs/metrics/traces …
De plus les outils existants sont « lourds », taillé pour de la grosse boite (faut bien vendre) avec des standards propriétaires et non générique.
Je n’ai pas de recul suffisant mais mon sentiment c’est que c’est compliqué et qu’un outil simple, uniformisé gratuit et open source manquait à ce niveau pour un niveau « intermediaire » (PME, TPME, indé)
Un standard est en train d’émerger concernant toute ces données que l’on appelle OpenTelemetry.
OpenTelemetry
Encore un nouveau framework ? C’est quoi, une couche de plus ?
OpenTelemetry c’est une collection d’outil, d’APIs et de SDKs permettant de mesurer, generer, collecter et exporter des données de télémetrie (metrics, logs et traces) afin de mieux analyser le comportement et les performances de nos applications.
Super mais qui porte le truc ? Est ce que c’est un projet qui va être adopté ?
Oui, en tout cas par Microsoft : https://learn.microsoft.com/en-us/azure/azure-monitor/app/opentelemetry-overview
Vu l’investissement de Microsoft pour les projets à succès Open Source, et vu le besoin, je pense qu’OpenTelemetry a de l’avenir.
Installer Signoz
Il existe plusieurs façon d’installer Signoz, j’ai choisi pour ma part la version Standalone (https://signoz.io/docs/install/docker/) sur mon VPS linux Debian 11.
Vous devrez télécharger le repo git :
git clone -b main https://github.com/SigNoz/signoz.git
puis vous rendre dans le répertoire suivant :
cd signoz/deploy/
et enfin lancer le script d’install suivant :
./install.sh
Cela va vous installer docker automatiquement. (faire un docker ps pour voir)
Vous devrez ouvrir les ports 3301 4317 et 4318.
Ensuite rendez vous à l’url suivante http://localhost:3301/
L’application web vous demandera de créer un compte et de s’y loguer. De base un ensemble de donnée « sample » est fourni :
Pour les retirer https://signoz.io/docs/operate/docker-standalone/#remove-the-sample-application-from-signoz-dashboard
Ajout d'OpenTelemetry à une app .Net
Pour le moment c’est en Preview (pas encore officiel). Voici la doc https://opentelemetry.io/docs/ et pour .net https://opentelemetry.io/docs/instrumentation/net/
Ca marche aussi avec Azuremonitor :https://learn.microsoft.com/en-us/azure/azure-monitor/app/opentelemetry-enable?tabs=net
Pour suivre les données d’une application .net, il faut faire qq manips dans le code source de celle ci :
Il faut installer des libs suivant nos besoins :
dotnet add package OpenTelemetry.Exporter.Console
dotnet add package OpenTelemetry.Extensions.Hosting --prerelease
dotnet add package OpenTelemetry.Instrumentation.AspNetCore --prerelease
dotnet add package OpenTelemetry.Instrumentation.Http --prerelease
dotnet add package OpenTelemetry.Instrumentation.SqlClient --prerelease
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
et ensuite modifier notre program.cs pour lui dire quoi monitorer : https://opentelemetry.io/docs/instrumentation/net/getting-started/
Voici un exemple de base :
builder.Services.AddOpenTelemetryTracing(budiler =>
{
budiler
.AddAspNetCoreInstrumentation()
.SetResourceBuilder(ResourceBuilder.CreateDefault()
.AddService("MyWebApp")
.AddTelemetrySdk()
)
.AddOtlpExporter(options =>
{
options.Endpoint = new Uri("http://localhost:4317"); // Signoz Endpoint
});
});
Dans cet exemple, on va utiliser la mesure des app .net AspNet. On créer une Resource avec un nom d’application « MyWebApp » à laquelle on applique la telemetry.
Enfin, on créer un endpoint Otlp qui permettra à d’autres app de pouvoir consulter les données. Ici c’est pour Signoz.
Voici ce que ca donne coté Signoz
Cliquer sur MyWebApp :
Votre application n’a pas encore de donnée. Si c’est un site web comme moi, aller sur celui ci et cliquez sur plein de lien pour créer de l’activité. Attendez qq minutes et voila :
C’est quand meme super simple ! A voir à l’utilisation. Sans doute que je ferai un article plus précis sur Signoz à l’avenir. En tout cas, pour le moment, ça coche toutes les cases pour moi !
Conclusion
J’y crois à ce projet.
Faudrait que je trouve le moyen de rajouter de la télémetrie au niveau serveur.
En attendant le projet est toujours en dev (mode preview) et c’est pas top pour de la prod.
Le code fournie ci dessus est déjà obsolete. Mais il marche.
A suivre !
Edit
Je suis tombé après cet article sur cette vidéo.
On est bien parti pour l’adopter rapidement cette techno.
Edit 2
Le projet étant en preview, il va y en avoir des sections « edit » dans ce cet article.
Je pose ca la : https://github.com/access55/A55.Signoz Package pour paramétrer plus facilement via des settings.
La config version doc Microsoft : https://learn.microsoft.com/fr-fr/dotnet/core/diagnostics/distributed-tracing-collection-walkthroughs?source=recommendations