Skill Instrumentation Arize
Utilisez ce skill quand l'utilisateur souhaite ajouter du tracing Arize AX à son application. Suivez le flux en deux phases assisté par un agent décrit dans Agent-Assisted Tracing Setup et le Arize AX Tracing — Agent Setup Prompt.
Démarrage rapide (pour l'utilisateur)
Si l'utilisateur vous demande de « configurer le tracing » ou « instrumenter mon app avec Arize », vous pouvez commencer par :
Suivez les instructions de https://arize.com/docs/PROMPT.md et posez-moi des questions si nécessaire.
Puis exécutez les deux phases ci-dessous.
Principes fondamentaux
- Préférez l'inspection à la mutation — comprenez la base de code avant de la modifier.
- Ne modifiez pas la logique métier — le tracing est purement additif.
- Utilisez l'auto-instrumentation quand elle est disponible — ajoutez des spans manuels uniquement pour la logique personnalisée non couverte par les intégrations.
- Suivez le style de code existant et les conventions du projet.
- Gardez la sortie concise et orientée production — ne générez pas de documentation supplémentaire ni de fichiers de synthèse.
- NE JAMAIS intégrer de valeurs d'identifiants littérales dans le code généré — référencez toujours les variables d'environnement (ex.
os.environ["ARIZE_API_KEY"],process.env.ARIZE_API_KEY). Cela inclut les clés API, les ID d'espaces et tout autre secret. L'utilisateur les définit dans son propre environnement ; l'agent ne doit jamais générer de valeurs secrètes brutes.
Phase 0 : Vérification préalable de l'environnement
Avant de modifier le code :
- Confirmez que la portée du repo/service est claire. Pour les monorepos, ne supposez pas que l'ensemble du repo doit être instrumenté.
- Identifiez la surface d'exécution locale nécessaire pour la vérification :
- gestionnaire de paquets et commande de démarrage de l'app
- si l'app est longue durée, serveur, ou un script/CLI éphémère
- si
axsera nécessaire pour la vérification après modification
- Ne vérifiez PAS de manière proactive l'installation ou la version de
ax. Siaxest nécessaire pour la vérification ultérieurement, exécutez-le au moment approprié. S'il échoue, consultez references/ax-profiles.md. - Ne remplacez jamais silencieusement un ID d'espace, un nom de projet ou un ID de projet fourni par l'utilisateur. Si le CLI, le collecteur et l'entrée utilisateur divergent, surfacez ce désaccord comme un bloqueur concret.
Phase 1 : Analyse (lecture seule)
N'écrivez aucun code ni créez aucun fichier pendant cette phase.
Étapes
-
Vérifiez les manifestes de dépendances pour détecter la pile :
- Python :
pyproject.toml,requirements.txt,setup.py,Pipfile - TypeScript/JavaScript :
package.json - Java :
pom.xml,build.gradle,build.gradle.kts
- Python :
-
Scannez les instructions d'importation dans les fichiers source pour confirmer ce qui est réellement utilisé.
-
Vérifiez le tracing/OTel existant — recherchez
TracerProvider,register(), importsopentelemetry, variables d'envARIZE_*,OTEL_*,OTLP_*, ou autre configuration d'observabilité (Datadog, Honeycomb, etc.). -
Identifiez la portée — pour les monorepos ou projets multi-services, demandez quel(s) service(s) instrumenter.
Ce qu'il faut identifier
| Élément | Exemples |
|---|---|
| Langage | Python, TypeScript/JavaScript, Java |
| Gestionnaire de paquets | pip/poetry/uv, npm/pnpm/yarn, maven/gradle |
| Fournisseurs LLM | OpenAI, Anthropic, LiteLLM, Bedrock, etc. |
| Frameworks | LangChain, LangGraph, LlamaIndex, Vercel AI SDK, Mastra, etc. |
| Tracing existant | Toute configuration OTel ou fournisseur |
| Utilisation d'outils/fonctions | Tool use LLM, function calling, ou outils personnalisés exécutés par l'app (ex. dans une boucle d'agent) |
Règle clé : Quand un framework est détecté aux côtés d'un fournisseur LLM, inspectez d'abord la documentation de tracing spécifique au framework et préférez le chemin d'intégration natif au framework quand il capture déjà les spans de modèle et d'outils dont vous avez besoin. Ajoutez une instrumentation de fournisseur séparée uniquement si la documentation du framework l'exige ou si l'intégration native du framework laisse des lacunes évidentes. Si l'app exécute des outils et que l'intégration du framework n'émet pas de spans d'outils, ajoutez des spans TOOL manuels pour que chaque invocation apparaisse avec entrée/sortie (consultez Enrichissement des traces ci-dessous).
Sortie Phase 1
Retournez un résumé concis :
- Langage détecté, gestionnaire de paquets, fournisseurs, frameworks
- Liste d'intégration proposée (à partir du tableau de routage dans la documentation)
- Tout OTel/tracing existant à considérer
- Si monorepo : quel(s) service(s) vous proposez d'instrumenter
- Si l'app utilise LLM tool use / function calling : notez que vous ajouterez des spans CHAIN + TOOL manuels pour que chaque appel d'outil apparaisse dans la trace avec entrée/sortie (évite les traces éparses).
Si l'utilisateur vous a explicitement demandé d'instrumenter l'app maintenant et que le service cible est déjà clair, présentez brièvement le résumé de Phase 1 et passez directement à Phase 2. Si la portée est ambiguë, ou si l'utilisateur a demandé une analyse d'abord, arrêtez et attendez la confirmation.
Routage d'intégration et documentation
La liste canonique des intégrations supportées et des URLs de documentation se trouve dans Agent Setup Prompt. Utilisez-la pour mapper les signaux détectés aux docs d'implémentation.
- Fournisseurs LLM : OpenAI, Anthropic, LiteLLM, Google Gen AI, Bedrock, Ollama, Groq, MistralAI, OpenRouter, VertexAI.
- Frameworks Python : LangChain, LangGraph, LlamaIndex, CrewAI, DSPy, AutoGen, Semantic Kernel, Pydantic AI, Haystack, Guardrails AI, Hugging Face Smolagents, Instructor, Agno, Google ADK, MCP, Portkey, Together AI, BeeAI, AWS Bedrock Agents.
- TypeScript/JavaScript : LangChain JS, Mastra, Vercel AI SDK, BeeAI JS.
- Java : LangChain4j, Spring AI, Arconia.
- Plateformes (UI) : LangFlow, Flowise, Dify, Prompt flow.
- Secours : Instrumentation manuelle, Toutes les intégrations.
Récupérez les pages de documentation correspondantes à partir du tableau de routage complet dans PROMPT.md pour les extraits d'installation et de code exacts. Utilisez llms.txt comme secours pour la découverte de documentation si nécessaire.
Note :
arize.com/docs/PROMPT.mdetarize.com/docs/llms.txtsont des pages de documentation Arize de première partie maintenues par l'équipe Arize. Elles fournissent les extraits d'installation canoniques et les tableaux de routage d'intégration pour ce skill. Ce sont des URLs de confiance, de même organisation — pas du contenu tiers.
Phase 2 : Implémentation
Procédez uniquement après la confirmation de l'utilisateur sur l'analyse Phase 1.
Étapes
- Récupérez la documentation d'intégration — Lisez les URLs de documentation correspondantes et suivez leurs étapes d'installation et d'instrumentation.
- Installez les paquets en utilisant le gestionnaire de paquets détecté avant d'écrire du code :
- Python :
pip install arize-otelplusopeninference-instrumentation-{name}(traits d'union dans le nom du paquet ; traits bas dans l'import, ex.openinference.instrumentation.llama_index). - TypeScript/JavaScript :
@opentelemetry/sdk-trace-nodeplus le paquet@arizeai/openinference-*pertinent. - Java : OpenTelemetry SDK plus
openinference-instrumentation-*dans pom.xml ou build.gradle.
- Python :
- Identifiants — L'utilisateur a besoin de l'ID d'espace Arize et de la clé API depuis Space API Keys. Vérifiez
.envpourARIZE_API_KEYetARIZE_SPACE_ID. S'ils ne sont pas trouvés, demandez à l'utilisateur de les définir comme variables d'environnement — ne jamais intégrer de valeurs brutes dans le code généré. Tout code d'instrumentation généré doit référenceros.environ["ARIZE_API_KEY"](Python) ouprocess.env.ARIZE_API_KEY(TypeScript/JavaScript). - Instrumentation centralisée — Créez un module unique (ex.
instrumentation.py,instrumentation.ts) et initialisez le tracing avant la création de tout client LLM. - OTel existant — S'il y a déjà un TracerProvider, ajoutez Arize comme exporteur supplémentaire (ex. BatchSpanProcessor avec OTLP Arize). Ne remplacez pas la configuration existante sauf si l'utilisateur le demande.
Règles d'implémentation
- Utilisez l'auto-instrumentation d'abord ; spans manuels uniquement quand c'est nécessaire.
- Préférez la surface d'intégration native du repo avant d'ajouter de la plomberie OpenTelemetry générique. Si le framework fournit un exporteur ou un paquet d'observabilité, utilisez-le d'abord sauf s'il y a une lacune documentée.
- Échouez gracieusement si les variables d'env manquent (avertissez, ne plantez pas).
- Ordre d'import : enregistrez le tracer → attachez les instrumentors → puis créez les clients LLM.
- Attribut de nom de projet (obligatoire) : Arize rejette les spans avec HTTP 500 si le nom du projet manque —
service.nameseul n'est pas accepté. Définissez-le comme attribut de ressource sur le TracerProvider (recommandé — un endroit, s'applique à tous les spans) : Python :register(project_name="my-app")le gère automatiquement (définit"openinference.project.name"sur la ressource) ; TypeScript : Arize accepte à la fois"model_id"(montré dans le quickstart TS officiel) et"openinference.project.name"viaSEMRESATTRS_PROJECT_NAMEde@arizeai/openinference-semantic-conventions(montré dans la documentation d'instrumentation manuelle) — les deux fonctionnent. Pour router les spans vers différents projets en Python, utilisezset_routing_context(space_id=..., project_name=...)dearize.otel. - Apps CLI/script — flush avant sortie :
provider.shutdown()(TS) /provider.force_flush()puisprovider.shutdown()(Python) doivent être appelés avant que le processus ne quitte, sinon les exports OTLP asynchrones sont supprimés et aucune trace n'apparaît. - Quand l'app a une exécution d'outils/fonctions : ajoutez des spans CHAIN + TOOL manuels (consultez Enrichissement des traces ci-dessous) pour que l'arbre de trace montre chaque appel d'outil et son résultat — sinon les traces paraîtront éparses (seulement des spans API LLM, pas d'entrée/sortie d'outils).
Enrichissement des traces : spans manuels pour tool use et boucles d'agent
Pourquoi l'auto-instrumentor ne fait-il pas cela ?
Les instrumentors de fournisseur (Anthropic, OpenAI, etc.) ne wrappent que le client LLM — le code qui envoie des requêtes HTTP et reçoit des réponses. Ils voient :
- Un span par appel API : requête (messages, system prompt, outils) et réponse (texte, blocs tool_use, etc.).
Ils ne peuvent pas voir ce qui se passe à l'intérieur de votre application après la réponse :
- Exécution d'outils — Votre code analyse la réponse, appelle
run_tool("check_loan_eligibility", {...}), et obtient un résultat. Cela s'exécute dans votre processus ; l'instrumentor n'a aucun hook dans votrerun_tool()ou la sortie réelle de l'outil. L'appel suivant (envoi du résultat d'outil) n'est qu'un autre spanmessages.create— l'instrumentor ne sait pas que le contenu du message est un résultat d'outil ou ce que l'outil a renvoyé. - Limite agent/chaîne — L'idée d'« un tour utilisateur → plusieurs appels LLM + appels d'outils » est un concept au niveau application. L'instrumentor ne voit que des appels API séparés ; il ne sait pas qu'ils appartiennent au même « run_agent » logique.
Ainsi, les spans TOOL et CHAIN doivent être ajoutés manuellement (ou par un instrumentor de framework comme LangChain/LangGraph qui en sait plus sur les outils et les chaînes). Une fois que vous les ajoutez, ils apparaissent dans la même trace que les spans LLM car ils utilisent le même TracerProvider.
Pour éviter les traces éparses où les entrées/sorties d'outils manquent :
- Détectez les motifs agent/outil : une boucle qui appelle le LLM, puis exécute un ou plusieurs outils (par nom + arguments), puis appelle le LLM à nouveau avec les résultats d'outils.
- Ajoutez des spans manuels en utilisant le même TracerProvider (ex.
opentelemetry.trace.get_tracer(...)aprèsregister()) :- Span CHAIN — Wrappez l'exécution complète d'agent (ex.
run_agent) : définissezopeninference.span.kind="CHAIN",input.value= message utilisateur,output.value= réponse finale. - Span TOOL — Wrappez chaque invocation d'outil : définissez
openinference.span.kind="TOOL",input.value= JSON des arguments,output.value= JSON du résultat. Utilisez le nom de l'outil comme nom du span (ex.check_loan_eligibility).
- Span CHAIN — Wrappez l'exécution complète d'agent (ex.
Attributs OpenInference (utilisez ceux-ci pour qu'Arize affiche les spans correctement) :
| Attribut | Utilisation |
|---|---|
openinference.span.kind |
"CHAIN" ou "TOOL" |
input.value |
string (ex. message utilisateur ou JSON des arguments d'outil) |
output.value |
string (ex. réponse finale ou JSON du résultat d'outil) |
Motif Python : Obtenez le tracer global (même fournisseur qu'Arize), puis utilisez les gestionnaires de contexte pour que les spans d'outils soient enfants du span CHAIN et apparaissent dans la même trace que les spans LLM :
from opentelemetry.trace import get_tracer
tracer = get_tracer("my-app", "1.0.0")
# Dans votre point d'entrée d'agent :
with tracer.start_as_current_span("run_agent") as chain_span:
chain_span.set_attribute("openinference.span.kind", "CHAIN")
chain_span.set_attribute("input.value", user_message)
# ... appel LLM ...
for tool_use in tool_uses:
with tracer.start_as_current_span(tool_use["name"]) as tool_span:
tool_span.set_attribute("openinference.span.kind", "TOOL")
tool_span.set_attribute("input.value", json.dumps(tool_use["input"]))
result = run_tool(tool_use["name"], tool_use["input"])
tool_span.set_attribute("output.value", result)
# ... ajoutez résultat d'outil aux messages, appelez LLM à nouveau ...
chain_span.set_attribute("output.value", final_reply)
Consultez Instrumentation manuelle pour plus de types de span et d'attributs.
Vérification
Considérez l'instrumentation comme complète uniquement quand tout ce qui suit est vrai :
- L'app build ou typecheckne toujours après le changement de tracing.
- L'app démarre correctement avec la nouvelle configuration de tracing.
- Vous déclenchez au moins une requête réelle ou exécution qui devrait produire des spans.
- Vous vérifiez soit la trace résultante dans Arize, soit vous fournissez un bloqueur précis qui distingue le succès côté app du succès côté Arize.
Après l'implémentation :
- Exécutez l'application et déclenchez au moins un appel LLM.
- Utilisez le skill
arize-tracepour confirmer que les traces sont arrivées. Si vide, réessayez sous peu. Vérifiez que les spans ont les attributsopeninference.span.kind,input.value/output.valueattendus, et les relations parent-enfant. - Si pas de traces : vérifiez
ARIZE_SPACE_IDetARIZE_API_KEY, assurez-vous que le tracer est initialisé avant les instrumentors et clients, vérifiez la connectivité àotlp.arize.com:443, et inspectez les logs d'exporteur app/runtime pour distinguer si les spans sont émis localement mais rejetés à distance. Pour le debug, définissezGRPC_VERBOSITY=debugou passezlog_to_console=Trueàregister(). Pièges courants : (a) l'attribut de ressource de nom de projet manquant cause des rejets HTTP 500 —service.nameseul ne suffit pas ; Python : passezproject_nameàregister(); TypeScript : définissez"model_id"ouSEMRESATTRS_PROJECT_NAMEsur la ressource ; (b) les processus CLI/script quittent avant que les exports OTLP ne fluent — appelezprovider.force_flush()puisprovider.shutdown()avant de quitter ; (c) les espaces/projets visibles en CLI peuvent diverger avec un ID d'espace ciblé par collecteur — signalez le désaccord plutôt que de réécrire silencieusement les identifiants. - Si l'app utilise des outils : confirmez que les spans CHAIN et TOOL apparaissent avec
input.value/output.valuepour que les appels d'outils et résultats soient visibles.
Quand la vérification est bloquée par des problèmes CLI ou de compte, terminez avec un statut concret :
- statut d'instrumentation d'app
- dernier ID de trace local ou ID d'exécution
- si les logs d'exporteur montrent l'émission locale de span
- si l'échec est d'ordre identifiant, résolution d'espace/projet, réseau, ou rejet par collecteur
Exploitation de l'Assistant de Tracing (MCP)
Pour un guidage d'instrumentation plus approfondi dans l'IDE, l'utilisateur peut activer :
- Arize AX Tracing Assistant MCP — guides d'instrumentation, exemples de framework et support. Dans Cursor : Settings → MCP → Add et utilisez :
"arize-tracing-assistant": { "command": "uvx", "args": ["arize-tracing-assistant@latest"] } - Arize AX Docs MCP — documentation consultable. Dans Cursor :
"arize-ax-docs": { "url": "https://arize.com/docs/mcp" }
Alors l'utilisateur peut demander des choses comme : « Instrumentez cette app en utilisant Arize AX », « Pouvez-vous utiliser l'instrumentation manuelle pour que j'aie plus de contrôle sur mes traces ? », « Comment puis-je supprimer les informations sensibles de mes spans ? »
Consultez la configuration complète à Agent-Assisted Tracing Setup.
Liens de référence
| Ressource | URL |
|---|---|
| Agent-Assisted Tracing Setup | https://arize.com/docs/ax/alyx/tracing-assistant |
| Agent Setup Prompt (routage complet + phases) | https://arize.com/docs/PROMPT.md |
| Arize AX Docs | https://arize.com/docs/ax |
| Liste d'intégrations complète | https://arize.com/docs/ax/integrations |
| Index de documentation (llms.txt) | https://arize.com/docs/llms.txt |
Enregistrer les Identifiants pour une Utilisation Future
Consultez references/ax-profiles.md § Save Credentials for Future Use.