Cette page guide les Partenaires Technologiques à travers le processus de création d’une intégration officielle de l’Agent Datadog.
Les intégrations basées sur l’Agent sont conçues pour collecter de la télémétrie à partir de logiciels ou de systèmes fonctionnant sur une infrastructure gérée par le client, où l’Agent Datadog est installé ou a accès au réseau. Ces intégrations utilisent l’Agent Datadog pour collecter et soumettre des données via des vérifications d’agent personnalisées développées par des Partenaires Technologiques approuvés.
Les vérifications d’agent peuvent émettre des métriques, des événements et des journaux dans le compte Datadog d’un client. Chaque intégration basée sur l’Agent est un package Python construit sur l’Agent Datadog, permettant aux clients de l’installer facilement via l’Agent Datadog. Les traces, cependant, sont collectées en dehors de la vérification de l’agent en utilisant l’un des SDK de Datadog. Pour plus d’informations, consultez la documentation sur l’instrumentation des applications.
Configurez l’outil de développement d’intégration de l’Agent Datadog
Utilisez l’outil de développement de l’Agent Datadog pour construire et tester votre intégration. Les étapes de configuration diffèrent selon que vous développez une intégration prête à l’emploi (OOTB) ou une Intégration Marketplace. Sélectionnez l’onglet approprié ci-dessous.
Créez un répertoire de travail. L’outil de développement s’attend à ce que votre travail soit situé dans $HOME/dd/ :
Créez et passez à une nouvelle branche pour votre intégration :
cd marketplace
git switch -c <YOUR_INTEGRATION_NAME> origin/master
Définissez marketplace comme le dépôt de travail par défaut :
ddev config set repo marketplace
Si votre dépôt est stocké en dehors de $HOME/dd/, spécifiez le chemin avant de le définir comme par défaut :
ddev config set repos.marketplace "/path/to/marketplace"ddev config set repo marketplace
Générez votre échafaudage
Utilisez la commande ddev create pour générer la structure de fichiers et de répertoires initiale pour votre intégration basée sur un agent.
Consultez l'onglet Méthode de Configuration dans la Plateforme Développeur pour la commande correcte pour votre intégration.
Effectuez une exécution à blanc (recommandé)
Utilisez l’option -n ou --dry-run pour prévisualiser les fichiers générés, sans rien écrire sur le disque. Confirmez que le chemin de sortie correspond à l’emplacement du dépôt attendu.
Après avoir vérifié l’emplacement du répertoire, exécutez la même commande sans le -n pour créer l’échafaudage. Suivez les instructions pour fournir les détails de l’intégration.
Chaque intégration basée sur un agent tourne autour d’une vérification d’agent, une classe Python qui collecte périodiquement de la télémétrie et la soumet à Datadog.
Les vérifications d’agent héritent de la classe de base AgentCheck et doivent répondre aux exigences suivantes :
Compatibilité Python :
Les intégrations pour Datadog Agent v7+ doivent prendre en charge Python 3. Toutes les nouvelles intégrations doivent cibler v7+.
Les intégrations pour Datadog Agent v5-v6 utilisent Python 2.7.
Héritage de classe : Chaque vérification doit sous-classer AgentCheck.
Point d’entrée : Chaque vérification doit implémenter une méthode check(self, instance).
Structure de paquet : Les vérifications sont organisées sous l’espace de noms datadog_checks. Par exemple, une intégration nommée <INTEGRATION_NAME> se trouve dans : <integration_name>/datadog_checks/<integration_name>/.
Nommage :
Le nom du paquet doit correspondre au nom de la vérification.
Les noms de module et de classe Python au sein du paquet peuvent être choisis librement.
Implémentez la logique de vérification
L’exemple suivant montre la logique pour une intégration nommée Awesome.
Cette vérification définit un service de vérification appelé awesome.search, qui recherche une chaîne spécifique sur une page web :
Renvoie OK si la chaîne est trouvée.
Renvoie WARNING si la page se charge mais que la chaîne est manquante.
Renvoie CRITICAL si la page ne peut pas être atteinte.
Pour apprendre à soumettre des données supplémentaires de votre vérification, voir :
Collecte de Logs d’Intégration d’Agent pour collecter des logs de votre AgentCheck en utilisant send_log. Meilleur pour l’émission de logs à source unique.
Tutoriel de Crawler HTTP pour collecter des logs de plusieurs sources de logs, comme lors de l’interrogation de plusieurs points de terminaison ou d’APIs HTTP externes.
Le fichier awesome/datadog_checks/awesome/check.py pourrait ressembler à ceci :
check.py
importrequestsimporttimefromdatadog_checks.baseimportAgentCheck,ConfigurationErrorclassAwesomeCheck(AgentCheck):"""AwesomeCheck derives from AgentCheck, and provides the required check method."""defcheck(self,instance):url=instance.get('url')search_string=instance.get('search_string')# It's a very good idea to do some basic sanity checking.# Try to be as specific as possible with the exceptions.ifnoturlornotsearch_string:raiseConfigurationError('Configuration error, please fix awesome.yaml')try:response=requests.get(url)response.raise_for_status()# Something went horribly wrongexceptExceptionase:# Ideally we'd use a more specific message...self.service_check('awesome.search',self.CRITICAL,message=str(e))# Submit an error logself.send_log({'message':f'Failed to access {url}: {str(e)}','timestamp':time.time(),'status':'error','service':'awesome','url':url})# Page is accessibleelse:# search_string is presentifsearch_stringinresponse.text:self.service_check('awesome.search',self.OK)# Submit an info logself.send_log({'message':f'Successfully found "{search_string}" at {url}','timestamp':time.time(),'status':'info','service':'awesome','url':url,'search_string':search_string})# search_string was not foundelse:self.service_check('awesome.search',self.WARNING)# Submit a warning logself.send_log({'message':f'String "{search_string}" not found at {url}','timestamp':time.time(),'status':'warning','service':'awesome','url':url,'search_string':search_string})
pytest et hatch sont utilisés pour exécuter les tests. Des tests sont nécessaires pour publier votre intégration.
Écrivez un test unitaire
La première partie de la méthode check pour Awesome récupère et vérifie deux éléments du fichier de configuration. C’est un bon candidat pour un test unitaire.
Ouvrez le fichier à awesome/tests/test_awesome.py et remplacez le contenu par ce qui suit :
test_awesome.py
importpytest# Don't forget to import your integrationfromdatadog_checks.awesomeimportAwesomeCheckfromdatadog_checks.baseimportConfigurationError@pytest.mark.unitdeftest_config():instance={}c=AwesomeCheck('awesome',{},[instance])# empty instancewithpytest.raises(ConfigurationError):c.check(instance)# only the urlwithpytest.raises(ConfigurationError):c.check({'url':'http://foobar'})# only the search stringwithpytest.raises(ConfigurationError):c.check({'search_string':'foo'})# this should not failc.check({'url':'http://foobar','search_string':'foo'})
pytest a le concept de marqueurs qui peuvent être utilisés pour regrouper les tests en catégories. Remarquez que test_config est marqué comme un test unit.
L’échafaudage est configuré pour exécuter tous les tests situés dans awesome/tests. Pour exécuter les tests, exécutez la commande suivante :
Ensuite, ouvrez le fichier à awesome/tests/conftest.py et remplacez le contenu par ce qui suit :
conftest.py
importosimportpytestfromdatadog_checks.devimportdocker_run,get_docker_hostname,get_hereURL='http://{}:8000'.format(get_docker_hostname())SEARCH_STRING='Thank you for using nginx.'INSTANCE={'url':URL,'search_string':SEARCH_STRING}@pytest.fixture(scope='session')defdd_environment():compose_file=os.path.join(get_here(),'docker-compose.yml')# This does 3 things:## 1. Spins up the services defined in the compose file# 2. Waits for the url to be available before running the tests# 3. Tears down the services when the tests are finishedwithdocker_run(compose_file,endpoints=[URL]):yieldINSTANCE@pytest.fixturedefinstance():returnINSTANCE.copy()
Ajoutez un test d’intégration
Après avoir configuré un environnement pour le test d’intégration, ajoutez un test d’intégration au fichier awesome/tests/test_awesome.py :
test_awesome.py
@pytest.mark.integration@pytest.mark.usefixtures('dd_environment')deftest_service_check(aggregator,instance):c=AwesomeCheck('awesome',{},[instance])# the check should send OKc.check(instance)aggregator.assert_service_check('awesome.search',AwesomeCheck.OK)# the check should send WARNINGinstance['search_string']='Apache'c.check(instance)aggregator.assert_service_check('awesome.search',AwesomeCheck.WARNING)
Pour accélérer le développement, utilisez l’option -m/--marker pour exécuter uniquement les tests d’intégration :
ddev test -m integration awesome
Testez votre vérification d’agent
Les intégrations basées sur l’Agent sont distribuées sous forme de fichiers Python wheel (.whl) que les clients installent via l’Agent Datadog. Avant de publier votre intégration, vous pouvez la tester localement en construisant et en installant manuellement le package wheel.
Construisez le wheel
Le fichier pyproject.toml fournit les métadonnées utilisées pour empaqueter et construire le wheel. Le wheel contient les fichiers nécessaires au fonctionnement de l’intégration elle-même, y compris la vérification de l’agent, le fichier d’exemple de configuration et les artefacts générés lors de la construction du wheel.
Une fois que votre pyproject.toml est prêt, créez un wheel en utilisant l’une des options suivantes :
(Recommandé) Avec l’outil ddev : ddev release build <INTEGRATION_NAME>.
Sans l’outil ddev : cd <INTEGRATION_DIR> && pip wheel . --no-deps --wheel-dir dist.
Installez le wheel
Le wheel est installé en utilisant la commande Agent integration, disponible dans Agent v6.10.0 ou ultérieur. Selon votre environnement, vous devrez peut-être exécuter cette commande en tant qu’utilisateur spécifique ou avec des privilèges spécifiques :
Ouvrez une pull request avec votre répertoire d’intégration dans le dépôt approprié, soit Datadog/integrations-extras soit Datadog/marketplace. La pull request est examinée en parallèle avec votre soumission à la Developer Platform.
Mise à jour de votre intégration
Après la publication de votre intégration, vous pouvez publier des mises à jour via la plateforme développeur.
Mise à jour de la version d’une intégration
Une mise à jour de la version est nécessaire chaque fois que vous ajoutez, supprimez ou modifiez des fonctionnalités (par exemple, lors de l’introduction de nouvelles métriques, de la mise à jour de tableaux de bord ou de la modification du code d’intégration). Ce n’est pas nécessaire pour les mises à jour non fonctionnelles, telles que les modifications de contenu écrit, de branding, de logos ou d’images.
Dans la Developer Platform, incluez une nouvelle entrée dans l’onglet Release Notes en suivant ce format :
## Version Number / Date (YYYY-MM-DD)
***Added***:
* Description of new feature
* Description of new feature
***Fixed***:
* Description of fix
* Description of fix
***Changed***:
* Description of update or improvement
* Description of update or improvement
***Removed***:
* Description of removed feature
* Description of removed feature
Assurez-vous de mettre à jour toutes les références au numéro de version dans la documentation et les instructions d’installation de l’intégration.
Lectures complémentaires
Documentation, liens et articles supplémentaires utiles: