Skip to main content

Instrumentation OpenTelemetry pour le Kit de développement logiciel (SDK) Copilot

Découvrez comment ajouter le suivi OpenTelemetry à vos SDK Copilot applications.

Qui peut utiliser cette fonctionnalité ?

Kit de développement logiciel (SDK) GitHub Copilot est disponible dans tous les forfaits Copilot.

Remarque

SDK Copilot est actuellement en préversion publique. Les fonctionnalités et la disponibilité sont susceptibles de changer.

          Kit de développement logiciel (SDK) GitHub Copilot prend en charge la configuration d’OpenTelemetry sur le processus CLI et la propagation du contexte de trace W3C entre le Kit de développement logiciel (SDK) et l’interface CLI.

Pour obtenir des exemples dans Python, Go et .NET, consultez le github/copilot-sdk référentiel.

Prise en charge de la télémétrie intégrée

Pour choisir la télémétrie, fournissez une TelemetryConfig valeur lors de la création du client :

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient({
  telemetry: {
    otlpEndpoint: "http://localhost:4318",
  },
});

Options de configuration de télémétrie

ChoixNode.JSDescription
Point de terminaison OTLPotlpEndpointURL du point de terminaison HTTP OTLP
Chemins d'accès au fichierfilePathChemin du fichier pour la sortie trace au format JSON-lines
Type d’exportateurexporterType
          `"otlp-http"` ou `"file"` |

| Nom de la source | sourceName | Nom de la portée d’instrumentation | | Capturer du contenu | captureContent | Indique s’il faut capturer le contenu du message |

Propagation du contexte de trace

Remarque

La plupart des utilisateurs n’ont pas besoin de cela. Le TelemetryConfig ci-dessus est tout ce dont vous avez besoin pour collecter les traces depuis le CLI. La propagation du contexte de trace est une fonctionnalité avancée pour les applications qui créent leurs propres étendues OpenTelemetry et veulent qu’elles apparaissent dans la même trace distribuée que les étendues de l’interface CLI.

Le Kit de développement logiciel (SDK) peut propager le contexte de trace W3C (traceparent/tracestate) sur des charges utiles JSON-RPC afin que les étendues de votre application et les étendues de l’interface CLI soient liées dans une trace distribuée. Cela est utile lorsque, par exemple, vous souhaitez afficher l’appel du SDK en tant que sous-élément de votre plage de traitement des requêtes.

Pour obtenir un diagramme de séquence détaillé du flux de session, consultez le github/copilot-sdk référentiel.

SDK vers CLI (sortant)

Fournissez une fonction de rappel dans les options du client. Cela n’est nécessaire que si votre application utilise @opentelemetry/api déjà et que vous souhaitez lier vos étendues avec les étendues de l’interface CLI. Le Kit de développement logiciel (SDK) appelle ce callback avant session.create, session.resume et session.send RPC :

TypeScript
import { CopilotClient } from "@github/copilot-sdk";
import { propagation, context } from "@opentelemetry/api";

const client = new CopilotClient({
  telemetry: { otlpEndpoint: "http://localhost:4318" },
  onGetTraceContext: () => {
    const carrier: Record<string, string> = {};
    propagation.inject(context.active(), carrier);
    return carrier; // { traceparent: "00-...", tracestate: "..." }
  },
});

CLI vers SDK (entrant)

Lorsque l’interface CLI appelle un gestionnaire d’outils, les traceparent et tracestate de l'étendue du CLI sont disponibles. Étant donné que le SDK n’a pas de dépendance OpenTelemetry, ceux-ci sont passés sous forme de chaînes brutes sur l’objet ToolInvocation . Restaurez le contexte manuellement si nécessaire :

TypeScript
import { propagation, context, trace } from "@opentelemetry/api";

session.registerTool(myTool, async (args, invocation) => {
  // Restore the CLI's trace context as the active context
  const carrier = {
    traceparent: invocation.traceparent,
    tracestate: invocation.tracestate,
  };
  const parentCtx = propagation.extract(context.active(), carrier);

  // Create a child span under the CLI's span
  const tracer = trace.getTracer("my-app");
  return context.with(parentCtx, () =>
    tracer.startActiveSpan("my-tool", async (span) => {
      try {
        const result = await doWork(args);
        return result;
      } finally {
        span.end();
      }
    })
  );
});

Lectures complémentaires