Tüm Ürünler
Search
Belge Merkezi

AgentLoop:Node.js LLM uygulamalarının özel olarak izlenmesi

Son Güncelleme:Oct 14, 2026

@loongsuite/otel-util-genai, ARMS GenAI semantik kurallarına uygun OpenTelemetry Span'leri oluşturur. Bu SDK'yı kullanarak model, mesajlar, tokenlar ve araç çağrıları gibi semantik öznitelikler içeren GenAI Span'leri (Giriş, Aracı, ReAct Adımı, LLM, Araç, Gömme, Getirme, Yeniden Sıralama ve Bellek) oluşturun. Bu öğretici; izleme modu seçimi, bağımlılık yükleme, başlatma, her tür için Span oluşturma, bağlam yayılımı, hata yönetimi ve uçtan uca doğrulamayı kapsar.

Not

Elle yapılan izleme örnekleri Node.js 20/22 LTS, @loongsuite/otel-util-genai@0.1.0 ve OpenTelemetry JS 1.30.x üzerinde doğrulanmıştır. Prob örnekleri Node.js 20, @loongsuite/cms_node_sdk@1.0.4 ve openai@5.23.2 üzerinde doğrulanmıştır. Bu araç Node.js 20 veya üzerini gerektirir. Üretim ortamlarında LTS sürümlerini kullanın.

İzleme modu seçin

@loongsuite/cms_node_sdk probu ve @loongsuite/otel-util-genai şu anda farklı Trace/Context API'lerini kullanır. Bunları aynı süreçte tek bir Provider seti olarak birleştirmeyin ve iki dışa aktarma işlem hattını başlatmayın.


Senaryo


Trace ve Exporter'ı kim başlatır


Bu yardımcı program kullanılacak mı


Elde edeceğiniz GenAI Span'leri


Desteklenen model SDK'ları için @loongsuite/cms_node_sdk@1.0.4 otomatik toplama özelliğini kullanın


ARMS Node.js probu


Hayır


Prob tarafından otomatik olarak oluşturulan LLM Span'leri


Giriş, Aracı, Adım, LLM, Araç ve daha fazlasından oluşan tam özel hiyerarşiye ihtiyaç duyuluyor


Uygulama standart OpenTelemetry JS'yi başlatır


Evet


Uygulama tarafından gerektiği şekilde oluşturulan tam hiyerarşi

Otomatik toplama için ARMS Node.js probunu kullanın

Yalnızca model SDK çağrılarının otomatik olarak toplanmasına ihtiyacınız varsa ARMS Node.js probunu kullanın. Aşağıdaki kombinasyon Node.js 20, gerçek DashScope istekleri ve ARMS sunucu tarafı verileri ile doğrulanmıştır:

npm install \
  @loongsuite/cms_node_sdk@1.0.4 \
  openai@5.23.2

export ARMS_LICENSE="<ARMS License>"
export CMS_SERVICE_NAME="weather-agent"
export ARMS_REGION_ID="cn-hongkong"
# No configuration required for the default workspace; set this only for non-default workspaces
# export ARMS_WORKSPACE="<workspace>"

node -r @loongsuite/cms_node_sdk/register app.js

ARMS_LICENSE bir kimlik bilgisidir ve kaynak koduna, görüntülere, günlüklere veya belgelere yazılmamalıdır. Hizmet adı aynı ortam içinde benzersiz ve kararlı olmalıdır.

@loongsuite/cms_node_sdk@1.0.4 şunun için OpenAI otomatik izleme desteği bildirir: openai >=4 <6. OpenAI 6 bu desteklenen aralıkta değildir. Bir model isteği başarılı olsa bile LLM Span'lerinin oluşturulduğunu varsayamazsınız. OpenAI veya probu yükselttikten sonra sunucu tarafı doğrulamasını yeniden yapmalısınız.

Bu probun ön yükleme giriş noktası uzun süre çalışan hizmetler için tasarlanmıştır. Yeni bir hizmet ilk kez başladığında probun yapılandırma el sıkışmasını tamamlaması gerekir. CLI betikleri, tek seferlik betikler ve son derece kısa Serverless işlemleri el sıkışma veya toplu dışa aktarma işlemi bitmeden önce sonlanabilir. Tam özel hiyerarşiye veya deterministik boşaltmaya ihtiyaç duyan kısa görevler için aşağıdaki bölümdeki manuel OTLP modunu kullanın.

Not

Uyumluluk sınırı: @loongsuite/cms_node_sdk@1.0.4 CMS Trace/Context kullanır ve @opentelemetry/api global TracerProvider'ını kaydetmez. Bu nedenle, getExtendedTelemetryHandler() doğrudan çağrıldığında standart OpenTelemetry API tarafındaki varsayılan Handler döndürülür; bu, probu otomatik olarak yeniden kullanamaz ve üst-alt ilişkilerini ile dışa aktarmayı garanti edemez. Bu belge bu kombinasyonu desteklenen bir izleme modu olarak listelemez.

Prob LLM Span'lerini otomatik olarak zaten oluşturuyorsa aynı istek için startLlm() işlevini tekrar çağırmayın. Giriş, Aracı, Adım ve Araç gibi iş Span'lerine de ihtiyacınız varsa aşağıdaki manuel modu seçin ve tüm izlemeyi tek bir standart OpenTelemetry Provider ile tamamlayın.

Tam manuel izleme için yardımcı programı kullanın

Uygulama standart bir OpenTelemetry JS TracerProvider, SpanProcessor ve OTLP Exporter başlatır ve provider'ı açıkça ExtendedTelemetryHandler öğesine iletir.

Bu modda uygulama gerekli GenAI Span'lerini manuel olarak oluşturur ve çıkmadan önce forceFlush() ve shutdown() işlevlerinin tamamlanmasını bekler. Bu belgenin geri kalanı bu modu kullanır. Aşağıdaki adımları tamamlayacaksınız:

  1. Bağımlılıkları yükleyin

  2. Kaynak ve içerik toplama ilkesini yapılandırın

  3. OpenTelemetry'yi başlatın

  4. GenAI Span'leri oluşturun (Giriş, Aracı, Adım, LLM, Araç ve diğerleri)

  5. Hataları yönetin ve Span'leri kapatın

  6. ARMS konsolunda izleme sonuçlarını doğrulayın

Ön koşullar

  • ARMS Uygulama İzleme erişimini etkinleştirdiniz ve tamamladınız.

  • Node.js 20 veya 22 LTS kullanıyorsunuz.

  • ARMS konsolundan mevcut uygulama ve bölge için OTLP HTTP uç noktasını ve kimlik doğrulama üstbilgisini aldınız.

  • Uygulamanın service.name değerinin aynı ortam içinde benzersiz ve kararlı olduğunu onayladınız.

  • İzleme alanları LLM İzleme alanı tanımı açıklamasına uygundur.

API anahtarlarını, OTLP kimlik doğrulama üstbilgilerini, tam kullanıcı girdilerini veya diğer hassas verileri kaynak koda veya günlüklere yazmayın.

Bağımlılıkları yükleyin

Tekrarlanabilirliği sağlamak için bu belge doğrulanmış yayın sürümlerini sabitler ve çıplak paket adlarını kullanmaz. Bu belge için doğrulama temel çizgisi @loongsuite/otel-util-genai@0.1.0 sürümüdür. Sonraki sürümlere yükseltme yaptıktan sonra doğrulama bölümünü izleyerek yeniden doğrulama yapmanız gerekir. Tüm ön sürümler bu belgede üretim izleme temel çizgisi olarak kabul edilmez.

npm install @loongsuite/otel-util-genai@0.1.0

Manuel izleme ayrıca doğrulanmış OpenTelemetry 1.30.x SDK'sını ve OTLP HTTP Exporter'ını gerektirir:

npm install \
  @opentelemetry/api@1.9.1 \
  @opentelemetry/sdk-trace-node@1.30.1 \
  @opentelemetry/sdk-trace-base@1.30.1 \
  @opentelemetry/resources@1.30.1 \
  @opentelemetry/exporter-trace-otlp-http@0.57.2

@loongsuite/otel-util-genai şu anda eş bağımlılığı OpenTelemetry JS 1.x sürüm satırındadır. Bu belgedeki örnekleri tam uyumluluk doğrulaması yapmadan OpenTelemetry SDK 2.x ile değiştirmeyin.

Not

Bu belgedeki sabit 1.30.1 kombinasyonu @loongsuite/otel-util-genai@0.1.0 için uyumluluk temel çizgisidir. 1.x satırındaki bilinen güvenlik sorunları ve azaltma rehberliği için bu belgenin ilerleyen kısımlarındaki OpenTelemetry 1.x güvenlik bildirimlerine bakın.

Kaynak ve içerik toplama ilkesini yapılandırın

Kaynak

En azından kararlı bir hizmet adı ayarlayın ve ARMS için GenAI uygulamasını ve izleme kaynağını işaretleyin:

export OTEL_SERVICE_NAME="weather-agent"
export OTEL_RESOURCE_ATTRIBUTES="acs.arms.service.feature=genai_app,gen_ai.instrumentation.sdk.name=loongsuite-genai-utils"

acs.arms.service.feature ve gen_ai.instrumentation.sdk.name düzenli Span Öznitelikleri değil, Kaynak Öznitelikleridir. OTEL_RESOURCE_ATTRIBUTES zaten ayarlanmışsa virgülle ekleyin. service.namespace ve deployment.environment.name gibi mevcut özniteliklerin üzerine yazmayın.

Mesaj içeriği toplama

Bu bölümdeki ortam değişkenleri yalnızca yardımcı program tarafından mesaj kaydını kontrol eder. Uygulama ortam değişkenlerini ayarlamadan yardımcı programı doğrudan kullandığında mesajlar NO_CONTENT modunda işlenir; bu mod tam mesaj içeriğini toplamaz. Süreci başlatmadan önce istenen modu açıkça ayarlayın:

export OTEL_SEMCONV_STABILITY_OPT_IN="gen_ai_latest_experimental"
export OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT="SPAN_ONLY"

Kullanılabilir değerler:


Değer


Span öznitelikleri


Olay


Önerilen kullanım


NO_CONTENT


Kaydedilmez


Kaydedilmez


Varsayılan üretim yapılandırması


SPAN_ONLY


Kaydedilir


Kaydedilmez


Hata ayıklama veya sansürlenmiş iş verileri


EVENT_ONLY


Kaydedilmez


Kaydedilir


Otel Logs yapılandırıldığında kullanın


SPAN_AND_EVENT


Kaydedilir


Kaydedilir


Yalnızca yinelenen depolama ve uyumluluk riskini onayladıktan sonra kullanın

Mesaj içeriği kişisel bilgileri, ticari sırları, ipuçlarını ve araç parametrelerini içerebilir. Bunu üretim ortamlarında etkinleştirmeden önce sansürleme, izin ve saklama süresi değerlendirmelerini tamamlayın.

@loongsuite/cms_node_sdk@1.0.4 OpenAI otomatik izlemesi probun kendi içerik toplama yapılandırmasını kullanır. Yukarıdaki yardımcı program ortam değişkenlerini kullanarak davranışını tahmin edemezsiniz. Bu sürüm varsayılan olarak OpenAI istek ve yanıt içeriğini kaydeder. İş içeriğin izlere girmesine izin vermiyorsa ve prob tarafında içerik toplamanın kapalı olduğunu onaylayamıyorsanız manuel moda geçin ve NO_CONTENT kullanın.

Manuel izleme için OpenTelemetry'yi başlatın

Aşağıdaki başlatma dosyası iş modüllerinden önce yüklenmelidir:

// telemetry.mjs
import { trace } from "@opentelemetry/api";
import { OTLPTraceExporter } from
  "@opentelemetry/exporter-trace-otlp-http";
import {
  Resource,
  detectResourcesSync,
  envDetectorSync,
} from "@opentelemetry/resources";
import {
  BatchSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
import {
  NodeTracerProvider,
} from "@opentelemetry/sdk-trace-node";
import {
  ExtendedTelemetryHandler,
} from "@loongsuite/otel-util-genai";

const detected = detectResourcesSync({
  detectors: [envDetectorSync],
});
const resource = Resource.default()
  .merge(detected)
  .merge(new Resource({
    "service.name":
      process.env.OTEL_SERVICE_NAME ?? "weather-agent",
    "acs.arms.service.feature": "genai_app",
    "gen_ai.instrumentation.sdk.name":
      "loongsuite-genai-utils",
  }));

const provider = new NodeTracerProvider({ resource });
provider.addSpanProcessor(
  new BatchSpanProcessor(new OTLPTraceExporter()),
);
provider.register();

export const handler = new ExtendedTelemetryHandler({
  tracerProvider: provider,
});
export const tracer = trace.getTracer("weather-agent", "1.0.0");

export async function shutdownTelemetry() {
  await provider.forceFlush();
  await provider.shutdown();
}

Bağlantı parametrelerini ARMS konsolundan kopyalayın. Değişken adlarını ve URL formatlarını konsol örneğinde gösterildiği gibi birebir kullanın. Bölgeyi, yolu veya kimlik doğrulama parametrelerini kendiniz oluşturmayın.

export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="<traces endpoint provided by the console>"
export OTEL_EXPORTER_OTLP_HEADERS="<authentication header provided by the console>"

Konsol genel bir OTEL_EXPORTER_OTLP_ENDPOINT sağlarsa konsol örneğinde gösterildiği gibi bu değişkeni kullanın.

Uygulama giriş noktası öncelikle telemetry.mjs dosyasını yüklemeli ve süreç çıkmadan önce verileri boşaltmalıdır:

import {
  handler,
  shutdownTelemetry,
} from "./telemetry.mjs";
import { runRequest } from "./agent.mjs";

try {
  await runRequest({ handler });
} finally {
  await shutdownTelemetry();
}

ConsoleSpanExporter yalnızca yerel gözlem için kullanılabilir. Verileri ARMS'e gönderemez.

Span türleri ve adlandırma

Span adı ve gen_ai.operation.name iki farklı alandır ve karıştırılmamalıdır.


Tür


Span adı


gen_ai.operation.name


Fabrika işlevi


Giriş


enter_ai_application_system


enter


createEntryInvocation()


Aracı


invoke_agent {agentName}


invoke_agent


createInvokeAgentInvocation()


ReAct Adımı


react step


react


createReactStepInvocation()


LLM


chat {model}


chat


createLLMInvocation()


Araç


execute_tool {toolName}


execute_tool


createExecuteToolInvocation()


Gömme


embeddings {model}


embeddings


createEmbeddingInvocation()


Getirme


retrieval {dataSourceId}


retrieval


createRetrievalInvocation()


Yeniden Sıralama


rerank_documents {model}


rerank_documents


createRerankInvocation()


Bellek


memory_operation {operation}


memory_operation


createMemoryInvocation()

Tipik bir Aracı istek izi şu şekilde olmalıdır:

ENTRY enter_ai_application_system
  AGENT invoke_agent WeatherAgent
    STEP react step
      LLM chat qwen-plus
      TOOL execute_tool get_weather
    STEP react step
      LLM chat qwen-plus

Aracın LLM ile aynı Adıma ait olup olmadığı uygulamanın gerçek yürütme modeline bağlıdır. Belirli bir ekran görüntüsüyle eşleşmesi için üst-alt ilişkileri uydurmayın.

Node.js bağlam yayılımı kuralları

Doğru bağlam yayılımı Node.js izlemesi için en önemli faktördür.

Bağlam otomatik olarak etkinleştirilmez

startXxx() yeni Span'e karşılık gelen OTel Bağlamını invocation.contextToken içine kaydeder ancak bunu otomatik olarak context.active() olarak ayarlamaz.

Manuel alt Span'ler oluştururken üst çağrının contextToken değerini ikinci bağımsız değişken olarak iletmeniz gerekir:

handler.startInvokeAgent(agentInv, entryInv.contextToken);
handler.startReactStep(stepInv, agentInv.contextToken);
handler.startLlm(llmInv, stepInv.contextToken);
handler.startExecuteTool(toolInv, stepInv.contextToken);

Otomatik izlemeye sahip olabilecek bir model SDK'sını, HTTP istemcisini veya veritabanını çağırırken ilgili bağlamı etkinleştirmek için context.with() kullanmanız gerekir:

import { context } from "@opentelemetry/api";

const response = await context.with(
  llmInv.contextToken,
  () => modelClient.chat.completions.create(request),
);

Aksi takdirde otomatik olarak oluşturulan SDK/HTTP Span'leri LLM Span'inin kardeş düğümleri haline gelebilir veya hatta ayrı bir iz oluşturabilir.

Genel öznitelikler Baggage aracılığıyla devralınır

Girişteki sessionId ve userId ile Aracıdaki agentName OTel Baggage'e yazılır. Bunların contextToken değerini üst bağlam olarak kullanarak oluşturulan sonraki GenAI Span'leri şunları devralabilir:

  • gen_ai.session.id

  • gen_ai.user.id

  • gen_ai.agent.name

Devralma doğru üst Bağlama bağlıdır. Üst-alt ilişkisi bozulduğunda bu genel öznitelikler de eksik olabilir.

Bu belgenin neden açık başlat/durdur kullandığı

Handler ayrıca entry(), invokeAgent() ve llm() gibi geri arama tarzı arabirimler sağlar ancak bu geri arama tarzı arabirimler geri aramaları otomatik olarak yeni çağrının Bağlamı ile yürütmez.

Geri arama otomatik olarak izlenen SDK'ları çağırdığında veya çok düzeyli GenAI Span'leri oluşturması gerektiğinde bağlam sınırlarının net olması için açık startXxx(), context.with(), stopXxx()/failXxx() kalıbını kullanın.

Giriş, Aracı ve ReAct Adımı oluşturun

import {
  createEntryInvocation,
  createInvokeAgentInvocation,
  createReactStepInvocation,
} from "@loongsuite/otel-util-genai";

const entryInv = createEntryInvocation({
  sessionId,
  userId,
  agentName: "WeatherAgent",
  inputMessages: [{
    role: "user",
    parts: [{ type: "text", content: userMessage }],
  }],
});
handler.startEntry(entryInv);

const agentInv = createInvokeAgentInvocation("dashscope", {
  agentName: "WeatherAgent",
  agentDescription: "Query the weather tool first, then answer the user's question.",
  requestModel: "qwen-plus",
});
handler.startInvokeAgent(agentInv, entryInv.contextToken);

const stepInv = createReactStepInvocation({ round: 1 });
handler.startReactStep(stepInv, agentInv.contextToken);

Tamamlandığında Span'leri içten dışa doğru durdurun:

stepInv.finishReason = "stop";
handler.stopReactStep(stepInv);

agentInv.inputTokens = totalInputTokens;
agentInv.outputTokens = totalOutputTokens;
agentInv.outputMessages = finalOutputMessages;
handler.stopInvokeAgent(agentInv);

entryInv.outputMessages = finalOutputMessages;
handler.stopEntry(entryInv);

Üst akış güvenilir bir total_tokens döndürüyorsa totalTokens değerini açıkça ayarlayabilirsiniz. Ayarlanmadığında araç toplamı girdi ve çıktı tokenlarından hesaplar.

LLM Span'i oluşturun

Aynı OpenTelemetry Provider tarafından toplanan model SDK'sı

Bu bölüm yalnızca otomatik izleme ve yardımcı programın açıkça aynı @opentelemetry/api TracerProvider'ını paylaştığı durumlar için geçerlidir. Prob bölümünde anlatılan @loongsuite/cms_node_sdk@1.0.4 senaryosu için geçerli değildir.

Manuel bir LLM Span'i oluşturmayın. Model çağrısını yalnızca Adımın Bağlamı içinde yürütün:

const response = await context.with(
  stepInv.contextToken,
  () => modelClient.chat.completions.create(request),
);

Yayınlamadan önce tek bir model isteğinin yalnızca bir LLM Span'i ürettiğini ve otomatik LLM Span'inin parentSpanId değerinin ilgili Adımı gösterdiğini onaylayın.

LLM Span'ini manuel olarak oluşturun

import {
  createLLMInvocation,
} from "@loongsuite/otel-util-genai";

const llmInv = createLLMInvocation({
  provider: "dashscope",
  operationName: "chat",
  requestModel: "qwen-plus",
  inputMessages: toGenAIInputMessages(messages),
  toolDefinitions: toGenAIToolDefinitions(tools),
});
handler.startLlm(llmInv, stepInv.contextToken);

try {
  const response = await context.with(
    llmInv.contextToken,
    () => modelClient.chat.completions.create({
      model: "qwen-plus",
      messages,
      tools,
    }),
  );

  const choice = response.choices?.[0];
  if (!choice?.message) {
    throw new Error("The model response has no first choice");
  }

  llmInv.responseId = response.id ?? null;
  llmInv.responseModelName = response.model ?? "qwen-plus";
  llmInv.finishReasons = [
    choice.finish_reason ?? "stop",
  ];
  llmInv.outputMessages = [
    toGenAIOutputMessage(
      choice.message,
      choice.finish_reason,
    ),
  ];

  if (response.usage) {
    llmInv.inputTokens =
      response.usage.prompt_tokens ?? null;
    llmInv.outputTokens =
      response.usage.completion_tokens ?? null;
    llmInv.totalTokens =
      response.usage.total_tokens ?? null;
  }

  handler.stopLlm(llmInv);
} catch (error) {
  handler.failLlm(
    llmInv,
    toSafeGenAIError(
      error,
      "LLMError",
      "LLM request failed",
    ),
  );
  throw error;
}

İsteği göndermeden önce LLM Span'ini durdurmayın. Aksi takdirde gecikme süresi, otomatik alt Span'ler ve hata durumu yanlış olur.

OpenAI uyumlu mesajları dönüştürün

Yalnızca { role, content } değerini dönüştüremezsiniz. Bir Aracı için ikinci tur model girdisi ayrıca asistan tool_calls ve tool rolü araç sonuçlarını içerir. Bu alanların kaybolması ARMS'in eksiksiz bir araç çağrı döngüsünü yeniden oluşturmasını engeller.

export function toGenAIMessageFinishReason(reason) {
  return reason === "tool_calls" ? "tool_call" : reason || "stop";
}

function textPart(content) {
  return { type: "text", content };
}

function toolCallPart(toolCall) {
  return {
    type: "tool_call",
    id: toolCall.id ?? null,
    name: toolCall.function.name,
    arguments: toolCall.function.arguments,
  };
}

export function toGenAIInputMessages(messages) {
  return messages.map((message) => {
    if (message.role === "tool") {
      return {
        role: "tool",
        parts: [{
          type: "tool_call_response",
          id: message.tool_call_id ?? null,
          response: message.content ?? "",
        }],
      };
    }

    if (
      message.content != null &&
      typeof message.content !== "string"
    ) {
      throw new TypeError(
        "This example only accepts string message content.",
      );
    }

    const parts = [];

    if (message.content) {
      parts.push(textPart(message.content));
    }

    for (const toolCall of message.tool_calls ?? []) {

      parts.push(toolCallPart(toolCall));
    }
    return { role: message.role, parts };
  });
}

export function toGenAIOutputMessage(message, finishReason) {

  const parts = [];

  if (message.content) {
    parts.push(textPart(message.content));
  }

  for (const toolCall of message.tool_calls ?? []) {

    parts.push(toolCallPart(toolCall));
  }
  return {
    role: "assistant",
    parts,
    finishReason: toGenAIMessageFinishReason(finishReason),
  };
}

export function toGenAIToolDefinitions(tools) {
  return tools.map((tool) => ({
    type: "function",
    name: tool.function.name,
    description: tool.function.description ?? null,
    parameters: tool.function.parameters ?? {},
  }));
}

Span öznitelikleri ve mesaj JSON farklı bitiş nedeni değerleri kullanır. Her ikisine de aynı dönüşümü uygulamayın:

Model returns choice.finish_reason = "tool_calls"

gen_ai.response.finish_reasons = ["tool_calls"]
output message.finish_reason    = "tool_call"

gen_ai.response.finish_reasons model sağlayıcısı tarafından döndürülen orijinal değeri korumalıdır. Çoğul tool_calls değerini çıktı mesajı Şemasına yazarken yalnızca tekil tool_call değerine dönüştürün.

toolCall.function.arguments genellikle bir JSON dizesidir. İş bu değeri zaten başarıyla ayrıştırdıysa ve bir nesne olarak kaydetmek istiyorsa hariç tutulmak üzere modelin orijinal değerini koruyun; böylece izleme verileri ile gerçek istekler arasında tutarsızlık oluşmaz.

Araç Span'i oluşturun

import {
  createExecuteToolInvocation,
} from "@loongsuite/otel-util-genai";

const toolInv = createExecuteToolInvocation(
  toolCall.function.name,
  {
    toolCallId: toolCall.id ?? null,
    toolDescription: "Query the weather for a specified city",
    toolType: "function",
    toolCallArguments: toolCall.function.arguments,
  },
);
handler.startExecuteTool(toolInv, stepInv.contextToken);

try {
  const result = await context.with(
    toolInv.contextToken,
    () => dispatchTool(
      toolCall.function.name,
      toolCall.function.arguments,
    ),
  );
  toolInv.toolCallResult = result;
  handler.stopExecuteTool(toolInv);
} catch (error) {
  handler.failExecuteTool(
    toolInv,
    toSafeGenAIError(
      error,
      "ToolError",
      "Tool execution failed",
    ),
  );
  throw error;
}

Araç çağrısı tamamlandıktan sonra sonucu OpenAI uyumlu formatta sonraki turun girdisine de ekleyin:

messages.push({
  role: "tool",
  tool_call_id: toolCall.id,
  content: result,
});

toolCallId asistan araç çağrısı, Araç Span'i ve araç yanıtı arasında tutarlı olmalıdır.

toolCallArguments ve toolCallResult doğrudan Araç Span'ine yazılır ve mesaj içeriği toplama anahtarı tarafından kontrol edilmez. Bunları ayarlamadan önce sansürleyin. Raporlanmaması gereken içerik NO_CONTENT tarafından otomatik olarak filtrelensin diye bırakılmamalı, atlanmalıdır.

Hataları yönetin ve Span'leri katman katman kapatın

Başlatılmış ve hala kayıt yapan her çağrı için ilgili stopXxx() veya failXxx() tam olarak bir kez çağrılmalıdır.

Ham hata mesajları model yanıt gövdelerini, istek parametrelerini, dosya yollarını veya kimlik bilgilerini içerebilir. failXxx() sağlanan message değerini Span Durumuna yazar, bu nedenle error.message veya String(error) değerlerini doğrudan iletmeyin. Sabit güvenli bir mesaj kullanın ve yalnızca kısıtlanmış hata türlerini koruyun:

const SAFE_ERROR_TYPE_PATTERN =
  /^[A-Za-z][A-Za-z0-9_.-]{0,127}$/;

function toSafeGenAIError(error, fallbackType, safeMessage) {
  const candidateType =
    error instanceof Error
      ? error.constructor?.name
      : null;
  const type =
    typeof candidateType === "string" &&
    SAFE_ERROR_TYPE_PATTERN.test(candidateType)
      ? candidateType
      : fallbackType;

  return { type, message: safeMessage };
}

İç içe bir çağrı başarısız olduğunda hataları içten dışa doğru işaretleyin:

failLlm / failExecuteTool
  -> failReactStep
    -> failInvokeAgent
      -> failEntry

Dıştaki catch bloğunda öncelikle şunu kontrol edin:

if (stepInv.span?.isRecording()) {
  handler.failReactStep(
    stepInv,
    toSafeGenAIError(
      error,
      "StepError",
      "Agent step failed",
    ),
  );
}

Bu, zaten bitmiş bir Span'i ikinci kez sonlandırmaktan kaçınır. failXxx() hata durumunu ve error.type değerini kaydeder. Çağırdıktan sonra orijinal hatayı yeniden fırlatmanız gerekir. İş hatalarını yutmayın. Uygulamanın hatayı günlüğe kaydetmesi gerekiyorsa sabit güvenli bir mesaj veya denetlenmiş sansürlenmiş alanlar kullanın. Ham hataları doğrudan çıkarmayın.

Normal iş Span'leri oluşturun

GenAI semantiğine ait olmayan dahili işlemler için yerel OTel Span'lerini kullanın. Örneğin, bir Araç içindeki bağımsız değişken doğrulamasını kaydedin:

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

const validationSpan = tracer.startSpan(
  "validate_weather_arguments",
  { attributes: { "app.validation.type": "json-schema" } },
  toolInv.contextToken,
);
const validationContext = trace.setSpan(
  toolInv.contextToken,
  validationSpan,
);

try {
  await context.with(
    validationContext,
    () => validateArguments(argumentsJson),
  );
} catch (error) {
  const safeError = toSafeGenAIError(
    error,
    "ValidationError",
    "Argument validation failed",
  );
  validationSpan.recordException({
    name: safeError.type,
    message: safeError.message,
  });
  validationSpan.setAttribute(
    "error.type",
    safeError.type,
  );
  validationSpan.setStatus({
    code: SpanStatusCode.ERROR,
    message: safeError.message,
  });
  throw error;
} finally {
  validationSpan.end();
}

Özel öznitelikler app.* gibi bir iş ad alanı kullanmalıdır. gen_ai.*, server.* ve error.type gibi araç tarafından tutulan alanların üzerine özel değerler yazmayın.

Gömme ve Getirme işlemleri

Diğer işlemler aynı yaşam döngüsünü izler: çağrıyı oluşturun, üst Bağlamı iletin, gerçek işlem tamamlandıktan sonra sonuçları doldurun ve normal şekilde veya hata ile sonlandırın.

const embeddingInv = createEmbeddingInvocation(
  "text-embedding-v3",
  { provider: "dashscope" },
);
handler.startEmbedding(embeddingInv, stepInv.contextToken);
// Call the embedding API
embeddingInv.inputTokens = usage.prompt_tokens;
embeddingInv.dimensionCount = vectors[0].length;
handler.stopEmbedding(embeddingInv);

const retrievalInv = createRetrievalInvocation({
  dataSourceId: "product-docs",
  query,
  topK: 5,
});
handler.startRetrieval(retrievalInv, stepInv.contextToken);
retrievalInv.documents = documents.map((document) => ({
  id: document.id,
  score: document.score,
  content: document.content,
  metadata: document.metadata,
}));
handler.stopRetrieval(retrievalInv);

Çok modlu girdi izlemesi

Görüntü URL girdisi

Uygulama tarafından modele gönderilen istek nesnesi ile GenAI Span'lerine yazılan mesaj nesnesi iki farklı şema kullanır. Bunları ayrı ayrı oluşturun. Aşağıdaki örnek model tarafından gerçekten alınan görüntü URL'sini kullanır, bu nedenle GenAI mesajlarında bir Uri Parçasına eşlenir:

const prompt = "Describe this image in one sentence.";
const imageUrl = "https://example.com/image.jpg";

const inputMessages = [{
  role: "user",
  parts: [
    { type: "text", content: prompt },
    {
      type: "uri",
      mimeType: "image/jpeg",
      modality: "image",
      uri: imageUrl,
    },
  ],
}];

const llmInv = createLLMInvocation({
  provider: "dashscope",
  operationName: "chat",
  requestModel: "qwen3-vl-plus",
  inputMessages,
  outputType: "text",
});
handler.startLlm(llmInv, entryInv.contextToken);

try {
  const response = await context.with(
    llmInv.contextToken,
    () => modelClient.chat.completions.create({
      model: "qwen3-vl-plus",
      messages: [{
        role: "user",
        content: [
          { type: "text", text: prompt },
          {
            type: "image_url",
            image_url: { url: imageUrl },
          },
        ],
      }],
    }),
  );

  const choice = response.choices?.[0];
  if (!choice?.message) {
    throw new Error("The model response has no first choice");
  }
  llmInv.responseId = response.id ?? null;
  llmInv.responseModelName =
    response.model ?? "qwen3-vl-plus";
  llmInv.finishReasons = [
    choice.finish_reason ?? "stop",
  ];
  llmInv.inputTokens =
    response.usage?.prompt_tokens ?? null;
  llmInv.outputTokens =
    response.usage?.completion_tokens ?? null;
  llmInv.totalTokens =
    response.usage?.total_tokens ?? null;
  llmInv.outputMessages = [{
    role: "assistant",
    parts: [{
      type: "text",
      content: choice.message.content ?? "",
    }],
    finishReason: choice.finish_reason ?? "stop",
  }];
  handler.stopLlm(llmInv);
} catch (error) {
  handler.failLlm(
    llmInv,
    toSafeGenAIError(
      error,
      "LLMError",
      "Multimodal LLM request failed",
    ),
  );
  throw error;
}

TypeScript genel API'si mimeType kullanır. SPAN_ONLY veya SPAN_AND_EVENT modunda 0.1.0 otomatik olarak şunları oluşturur:

gen_ai.input.messages
gen_ai.input.multimodal_metadata

Her iki öznitelik de URI verileri için Şema alanı mime_type kullanır:

[
  {
    "type": "uri",
    "mime_type": "image/jpeg",
    "uri": "https://example.com/image.jpg",
    "modality": "image"
  }
]

Çok modlu meta veriler yalnızca son mesajlardaki Uri Parçalarını özetler. Metin, BLOB, Base64Blob veya Dosya içermez. Araç yalnızca telemetri verilerini kaydeder; medya yüklemekten, modelleri çağırmaktan veya sağlayıcı dosya nesnelerini URI'lere dönüştürmekten sorumlu değildir.

Dosya Parçası destek sınırları

TypeScript'teki Dosya Parçası şunu kullanır:

{
  type: "file",
  mimeType: "application/pdf",
  modality: "document",
  fileId: "file-123",
}

Mesaj JSON'a yazıldığında fileId file_id olarak ve mimeType mime_type olarak dönüştürülür. Ancak farklı model sağlayıcılarının dosya yükleme ve dosya kimliği referans alma arayüzleri önemli ölçüde farklıdır. Bu belge Dosya Parçasını gerçek model uçtan uca doğrulaması tamamlanmış bir örnek olarak ele almaz. Uygulama bir model isteği göndermek için sağlayıcı tarafından döndürülen bir dosya kimliğini gerçekten kullandığında yalnızca Dosya Parçasını eşleyin. Alanı göstermek için sahte dosya kimlikleri oluşturmayın.

Olay Günlüğü alanı kuralları

TypeScript fabrika işlevlerini doğrudan çağırırken camelCase kullanın:

{ type: "uri", mimeType: "image/png", modality: "image", uri }
{ type: "file", mimeType: "application/pdf", modality: "document", fileId }

Olay Günlüğü üretim JSON Şemasıdır. Girdi kayıtları snake_case kullanmalıdır:

{
  "type": "uri",
  "mime_type": "image/png",
  "modality": "image",
  "uri": "https://example.com/input.png"
}
{
  "type": "file",
  "mime_type": "application/pdf",
  "modality": "document",
  "file_id": "file-123"
}

TypeScript nesne alanlarını Olay Günlüğü Şemasıyla karıştırmayın. convertEventLogToTrace() son girdi/çıktı mesajlarına göre aşağıdakileri oluşturur:

gen_ai.input.multimodal_metadata
gen_ai.output.multimodal_metadata

Her iki meta veri alanı da yalnızca ilgili mesajlardaki URI Parçalarını özetler. Eşlik eden Olay Günlüğü Demosu iki yönlü serileştirmeyi doğrulamak için bir image/png girdi URI'si ve bir image/webp çıktı URI'si kullanır. Olay Günlüğü dönüşümünü ve OTLP raporlamasını doğrular; belirli bir modelin gerçekten bir görüntü oluşturduğunu temsil etmez.

Yerel test ve uçtan uca doğrulama

Çevrimdışı birim testi

Testler yalnızca Span'lerin oluşturulduğunu iddia etmekle kalmamalı, ayrıca şunları da kontrol etmelidir:

  • Tüm Span'ler aynı traceId'yi paylaşır.

  • Aracının parentSpanId'si Girişi gösterir.

  • Adımın parentSpanId'si Aracıyı gösterir.

  • LLM ve Araç parentSpanId değerleri ilgili Adımı gösterir.

  • Otomatik olarak oluşturulan SDK/HTTP Span'leri manuel LLM veya Araç Span'inin altındadır.

  • gen_ai.session.id, gen_ai.user.id ve gen_ai.agent.name devralınır.

  • LLM ve Aracı token değerleri doğrudur.

  • Hem asistan araç çağrısı hem de araç yanıtı korunur.

  • Çok modlu alanlar mime_type / file_id kullanır, camelCase kalıntısı yoktur.

  • Çok modlu meta veriler yalnızca URI Parçalarını içerir.

  • Hata zincirindeki tüm Span'ler Hata olarak işaretlenir.

Eşlik eden Demoyu indirdikten sonra şunu çalıştırın:

cd nodejs-genai-util-demo
npm ci
npm test
npm run demo

Demonun package.json dosyası bu belgede doğrulanan npm sürümlerini sabitlemelidir. Müşteriye yönelik Demolar file:../... yerel kaynak kodu yollarına bağlı olmamalıdır.

Gerçek model doğrulaması

export DASHSCOPE_API_KEY="<your-api-key>"
npm run demo:dashscope

Bu adım modelin, araç çağrısının ve mesaj dönüşümünün doğru olduğunu ayrı ayrı onaylamak için bellek içi bir Exporter kullanır. Modelin araç çağrısını gerçekten tamamladığını kontrol edin ve program çıktısından traceId'yi kaydedin. API anahtarlarını günlüklerde yazdırmayın.

Araç çağrısından OTLP'ye birleşik doğrulama

export OTEL_SERVICE_NAME="weather-agent-validation"
export OTEL_RESOURCE_ATTRIBUTES="service.name=weather-agent-validation"
export OTEL_EXPORTER_OTLP_ENDPOINT="<ARMS endpoint>"
export OTEL_EXPORTER_OTLP_HEADERS="<ARMS auth header>"
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export GENAI_DEMO_ALLOW_CONTENT_EXPORT="true"
npm run demo:e2e

GENAI_DEMO_ALLOW_CONTENT_EXPORT=true eşlik eden Demonun güvenlik onay anahtarıdır; operatörün örnekteki tam girdi ve çıktının yapılandırılan OTLP arka ucuna gönderilebileceğini onayladığını belirtir. Verileri otomatik olarak sansürlemez. Yalnızca herkese açık, kurgusal veya zaten sansürlenmiş veriler kullanın.

Yalnızca hem forceFlush() hem de shutdown() başarılı olduğunda Demo şunu çıkarır:

export completed traceId=<trace-id>

Exporter'dan başarılı bir dışa aktarma isteği yalnızca istemcinin dışa aktarma isteğini tamamladığını kanıtlar. ARMS konsolu doğrulamasının yerine geçemez.

Konsol OTEL_EXPORTER_OTLP_TRACES_ENDPOINT sağlarsa konsol örneğinde gösterildiği gibi bu değişkeni kullanın. URL'yi kendiniz yeniden yazmayın.

Görüntü URL'sinden OTLP'ye birleşik doğrulama

export DASHSCOPE_API_KEY="<your-api-key>"
export OTEL_SERVICE_NAME="multimodal-agent-validation"
export OTEL_RESOURCE_ATTRIBUTES="service.name=multimodal-agent-validation"
export OTEL_EXPORTER_OTLP_ENDPOINT="<ARMS endpoint>"
export OTEL_EXPORTER_OTLP_HEADERS="<ARMS auth header>"
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export GENAI_DEMO_ALLOW_CONTENT_EXPORT="true"
npm run demo:multimodal-e2e

Görüntü hassas içerik içermeyen genel bir HTTPS URL'si olmalı ve kullanıcı adları, parolalar, sorgu parametreleri, parçalar veya geçici imzalama parametreleri içermemelidir. Tam URI hem gen_ai.input.messages hem de gen_ai.input.multimodal_metadata içine yazılır.

Program gerçek model yanıtını, util.version, model adını, yanıt kimliğini, bitiş nedenini, tokenları ve traceId'yi çıkarmalıdır. Model yanıtı görüntü içeriğini yansıtmalıdır. Yalnızca HTTP 200 almak modelin görüntüyü işlediğini kanıtlamaz.

Olay Günlüğünden OTLP'ye birleşik doğrulama

Bu kullanım durumu bir modeli çağırmaz. Yalnızca Olay Günlüğü dönüşümünü, girdi/çıktı çok modlu alanlarını ve OTLP raporlamasını doğrular:

export OTEL_SERVICE_NAME="event-log-validation"
export OTEL_RESOURCE_ATTRIBUTES="service.name=event-log-validation"
export OTEL_EXPORTER_OTLP_ENDPOINT="<ARMS endpoint>"
export OTEL_EXPORTER_OTLP_HEADERS="<ARMS auth header>"
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export GENAI_DEMO_ALLOW_CONTENT_EXPORT="true"
npm run demo:event-log-e2e

Program span.count=4, input.mime_type=image/png, output.mime_type=image/webp ve traceId'yi çıkarmalıdır. Sunucu ENTRY -> AGENT -> STEP -> LLM yapısını almalı ve hem gen_ai.input.multimodal_metadata hem de gen_ai.output.multimodal_metadata mevcut olmalıdır.

ARMS Node.js probu otomatik toplama doğrulaması

Bu kullanım durumu ikinci bir Provider'ın karışmasını önlemek için manuel yardımcı program Demosundan ayrı olarak yüklenir:

cd nodejs-genai-util-demo/arms-probe-demo
npm ci

export DASHSCOPE_API_KEY="<your-api-key>"
export ARMS_LICENSE="<ARMS License>"
export CMS_SERVICE_NAME="probe-openai-validation"
export ARMS_REGION_ID="cn-hongkong"
# No configuration required for the default workspace
# export ARMS_WORKSPACE="<workspace>"

node -r @loongsuite/cms_node_sdk/register app.js

Eşlik eden doğrulama programı @loongsuite/cms_node_sdk@1.0.4 ve openai@5.23.2 sürümlerini sabitler. Varsayılan olarak yeni bir hizmetin ilk yapılandırma el sıkışması için 65 saniye bekler ve ardından gerçek DashScope çağrıları yapar. Zaten kayıtlı olan hizmetler için doğrulamayı kısaltmak amacıyla PROBE_WARMUP_MS=0 ayarlayın.

Sunucu en azından HTTP SERVER -> openai.chat LLM -> model HTTP CLIENT üst-alt ilişkisini göstermelidir. openai.chat Span'i şunları içermelidir:

  • gen_ai.span.kind=LLM ve gen_ai.operation.name=chat

  • İstek/yanıt modeli, yanıt kimliği ve bitiş nedeni

  • Girdi/çıktı/toplam tokenlar

  • Girdi ve çıktı mesajları (yalnızca iş içerik kaydına izin verdiğinde)

  • otel.scope.name=openai, otel.scope.version=1.0.4

  • telemetry.sdk.name=cms_node_sdk ve doğru service.name içeren Kaynak

Günlükler BatchSpanProcessor: span export failed, HTTP 404/403 gösteriyorsa veya hizmet ARMS'te bulunamıyorsa model 200 döndürdüğü için izlemenin başarılı olduğunu varsaymayın. Lisans, bölge, çalışma alanı ve hizmet yapılandırmasının tutarlı olduğunu onaylayın. Yeni hizmetler için ilk yapılandırma el sıkışma süresine izin verin. Kısa görevler için manuel OTLP moduna geçin.

İzleme sonuçlarını doğrulayın

ARMS konsolundaki İz Gezgini altında bulunan LLM Uygulama İzleme sayfasındaki her öğeyi çıktı traceId'sini kullanarak doğrulayın:

  1. İz doğru bölge, doğru uygulama ve doğru service.name altında alınabilir.

  2. Çağrı zinciri ağacı iş yürütme sırasıyla eşleşir.

  3. Tek bir model isteğinde yalnızca bir LLM Span'i vardır.

  4. Her GenAI Span'i doğru gen_ai.span.kind ve gen_ai.operation.name değerine sahiptir.

  5. LLM gen_ai.request.model, girdi/çıktı/toplam tokenları içerir.

  6. Aracı tokenları içerdiği model çağrılarının toplamına eşittir.

  7. Araç ad, çağrı kimliği, bağımsız değişkenler ve sonuç içerir.

  8. İçerik toplama etkinleştirildiğinde ikinci tur LLM girdisi hem araç çağrısını hem de araç yanıtını içerir.

  9. Giriş, Aracı, Adım, LLM ve Araç oturum/kullanıcı/aracı genel özniteliklerine sahiptir.

  10. Başarısızlık durumunda açık kalan tüm Span'ler Hata olarak işaretlenir.

  11. Görüntü doğrulamasında gen_ai.input.messages type=uri, mime_type, modality ve gerçek bir URL içerir.

  12. gen_ai.input.multimodal_metadata bir JSON dizisidir ve yalnızca URI Parçalarını özetler.

  13. Olay Günlüğü doğrulamasında gen_ai.output.messages ve gen_ai.output.multimodal_metadata çıktı URI'lerini içerir ve mime_type kullanır.

  14. Mesaj JSON'ında ve meta verilerde kalan mimeType / fileId yoktur.

  15. otel.scope.version gerçekten yüklenen npm sürümüyle eşleşir.

  16. Kaynak service.name, acs.arms.service.feature=genai_app ve gen_ai.instrumentation.sdk.name=loongsuite-genai-utils içerir.

Web sitesi örnek bakıcısı ayrıca aynı npm sürümleriyle Node.js 20 ve 22 üzerinde temiz dizinlerde ayrı ayrı doğrulama yapmalıdır. Sunucu tarafı sorgulama tamamlanmadığında, yerel kaynak kodu hala kullanıldığında veya sürümler tutarsız olduğunda örnekler doğrulanmış olarak işaretlenmemelidir.

OpenTelemetry 1.x güvenlik bildirimleri

Bu belgedeki sabit 1.30.1 kombinasyonu @loongsuite/otel-util-genai@0.1.0 için uyumluluk kabul temel çizgisidir ve OpenTelemetry 2.x'ten sonraki tüm güvenlik düzeltmelerini içerdiği anlamına gelmez. Bağımlılık taraması aşağıdaki iki sorunu bildirecektir:

  • @opentelemetry/core <2.8.0 propagator içinde gelen W3C Baggage ayrıştırmasının toplam boyutunu ve giriş sayısını sınırlamaz (CVE-2026-54285). Node.js'teki varsayılan 16 KiB HTTP üstbilgi sınırı genel HTTP saldırı yüzeyini azaltır. Ağ geçitleri yine de üstbilgi boyutunu sınırlamalıdır. Özel mesaj taşıma kullanırken, üstbilgi sınırını yükseltirken veya özel bir TextMapGetter kullanırken propagator'u çağırmadan önce güvenilmeyen bagajın boyutunu ve giriş sayısını sınırlayın.

  • @opentelemetry/propagator-jaeger <2.9.0 hatalı biçimlendirilmiş uber-trace-id veya uberctx-* üstbilgilerini ayrıştırırken sürecin çıkmasına neden olabilir (CVE-2026-59892). Bu paket @opentelemetry/sdk-trace-node öğesinin geçişli bağımlılığı olarak yüklenir ancak bu belge Jaeger Propagator'u etkinleştirmez. Varsayılan W3C TraceContext/Baggage yapılandırması bu sorundan etkilenmez. Bu 1.x kombinasyonuyla OTEL_PROPAGATORS=jaeger ayarlamayın. Eski sistemler Jaeger üstbilgilerini almak zorundaysa bu üstbilgileri ağ geçidinde filtreleyin veya doğrulayın ve tam uyumluluk testiyle bir yükseltme planlayın.

Tarama uyarılarını bastırmak için tek tek bağımlılıkları 2.x'e yükseltmeyin; bu API/SDK sürüm uyumsuzluğuna neden olabilir. Yükseltmeyi bağımsız bir değişiklik olarak ele alın ve birim testlerini, OTLP dışa aktarmayı ve ARMS sunucu tarafı izlerini yeniden doğrulayın. Güvenlik tavsiyeleri için GHSA-8988-4f7v-96qf ve GHSA-45rx-2jwx-cxfr adreslerine bakın.

SSS

ARMS'te hiç veri yok

  • Uç noktanın, bölgenin ve kimlik doğrulama üstbilgisinin aynı uygulamadan olduğunu doğrulayın.

  • service.name değerini doğrulayın.

  • ConsoleSpanExporter yerine bir OTLP Exporter kullandığınızı onaylayın.

  • Süreç çıkmadan önce forceFlush() ve shutdown() çağrıldığını onaylayın.

  • Exporter hata günlüğünü ve ağ gidiş trafiğini kontrol edin.

ARMS Node.js probu kullanırken ayrıca ARMS_LICENSE, ARMS_REGION_ID, ARMS_WORKSPACE ve CMS_SERVICE_NAME değerlerini kontrol edin. Yeni bir hizmetin ilk başlatılması için yapılandırma el sıkışma süresine izin verin. Model çağrısı başarılı olsa bile exporter 404/403 hatası alınıyorsa bu yine de bir raporlama hatasıdır.

ARMS probu altında LLM Span'i yok

  • Node.js başlatma bağımsız değişkenlerinin -r @loongsuite/cms_node_sdk/register içerdiğini ve probun openai öncesinde yüklendiğini onaylayın.

  • @loongsuite/cms_node_sdk@1.0.4 yalnızca openai >=4 <6 desteğini bildirir. OpenAI 6 doğrulanan aralıkta değildir.

  • Başlatma günlüğünün openai izlemesini listeleyip listelemediğini kontrol edin.

  • Yalnızca model yanıtına bakarak değil ARMS sunucu tarafı verileriyle onaylayın.

Yardımcı program Span'leri dışa aktarmıyor

@loongsuite/cms_node_sdk@1.0.4 standart @opentelemetry/api Provider'ını kaydetmez ve varsayılan Handler tarafından doğrudan yeniden kullanılamaz. İki yaklaşımı karıştırmayın. Yardımcı programa ihtiyacınız olduğunda başlatma bölümüne göre standart bir OpenTelemetry Provider ve OTLP Exporter başlatın.

Aynı model çağrısı için iki LLM Span'i

Bu genellikle model SDK'sının otomatik izleme tarafından zaten toplandığını ve işin ayrıca startLlm() çağırdığını gösterir. Aynı Provider içinde yalnızca bir tür LLM izlemesi tutun. @loongsuite/cms_node_sdk@1.0.4 ve yardımcı program izleme modu bölümüne göre tamamen ayrılmalıdır.

Span'ler aynı izdedir ancak hiyerarşi yanlıştır

  • Manuel alt Span'lerin açıkça üst contextToken geçirip geçirmedığını kontrol edin.

  • Otomatik olarak izlenen işlemlerin context.with() içinde yürütülüp yürütülmediğini kontrol edin.

  • Kodun AsyncLocalStorage Bağlamını doğru şekilde yaymayan özel eşzamansız sınırları aşıp aşmadığını kontrol edin.

Alt Span'lerde oturum, kullanıcı veya aracı eksik

Giriş/Aracının ilgili alanları ayarlayıp ayarlamadığını kontrol edin ve alt Span'lerin üst çağrının contextToken değerini kullandığını onaylayın.

Girdi ve çıktı mesajları görünmüyor

Ortam değişkenlerinin Node.js süreci başlamadan önce ayarlandığını onaylayın:

OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=SPAN_ONLY

Ardından mesaj dönüşüm sonucunun { role, parts } yapısına uyup uymadığını kontrol edin.

Görüntü mesajları mevcut ancak çok modlu meta veri yok

  • Yüklenen sürümün bu belgeden doğrulanmış sürüm 0.1.0 olduğunu onaylayın. Sonraki sürümleri kullanırken tam doğrulamayı yeniden çalıştırın.

  • İçerik toplama modunun SPAN_ONLY veya SPAN_AND_EVENT olduğunu onaylayın.

  • Meta veriler yalnızca type: "uri" Parçalarını özetler, BLOB, Base64Blob veya Dosya içermez.

  • TypeScript API'sini doğrudan çağırırken mimeType, modality ve uri değerlerini kontrol edin.

  • Olay Günlüğü girdisi için Şema alanları mime_type, modality ve uri değerlerini kontrol edin.

  • invocation.attributes değerinin otomatik olarak oluşturulan özniteliklerin üzerine açıkça yazıp yazmadığını kontrol edin.

Dosya Parçası çok modlu meta verilerde görünmüyor

Bu beklenen bir davranıştır. Dosya Parçası mesaj JSON'da korunur ve fileId değerini file_id olarak serileştirir ancak URI meta verileri yalnızca Uri Parçalarını özetler. Sağlayıcının gerçek isteği bir dosya kimliği kullandığında yalnızca Dosya Parçasını kaydedin.

Yükleme sırasında eş bağımlılık hataları

Projenin OpenTelemetry SDK 1.x ve 2.x'i karıştırıp karıştırmadığını kontrol edin. Bu belgedeki doğrulanan kombinasyon API 1.9.1, trace/resources 1.30.1 ve OTLP exporter 0.57.2'dir.

Kısa görevlerde aralıklı Span kaybı

Manuel OTLP modunda doğal süreç çıkışına güvenmeyin. CLI betikleri, Serverless işleyicileri ve test programları açıkça forceFlush()/shutdown() beklemelidir.

@loongsuite/cms_node_sdk/register sinyal işleme SIGINT/SIGTERM'de kapatmayı yürütür ancak yeni hizmetler yine de ilk yapılandırma el sıkışmasına ihtiyaç duyar. Son derece kısa görevler için yaşam döngüsünü açıkça kontrol edebileceğiniz manuel OTLP modunu tercih edin.

Başvurular

Eşlik Eden Demo

Eşlik eden Demo şunları içerir:

  • Çevrimdışı model ve bellek içi Exporter

  • Gerçek DashScope OpenAI uyumlu API çağrıları

  • Gerçek DashScope araç çağrısından OTLP'ye birleşik doğrulama

  • Gerçek Qwen-VL görüntü URL'sinden OTLP'ye birleşik doğrulama

  • Olay Günlüğü girdi/çıktı çok modlu meta verilerinden OTLP'ye birleşik doğrulama

  • Bağımsız ARMS Node.js probu + OpenAI 5 otomatik izleme doğrulaması

  • OTLP HTTP dışa aktarma

  • Araç mesajı dönüşümü

  • Çok modlu URI, mime_type ve otomatik meta veri doğrulaması

  • Normal iz ve hata izi birim testleri

  • Otomatik alt Span üst-alt ilişkilerinin context.with() doğrulaması

Bu belge doğrulanmış Demo için sabit bir commit referansı kullanır; böylece sonraki depo değişikliklerinden kaynaklanan belge kodu ve npm paketi davranış sapmaları önlenir. Bu belgedeki doğrulama temel çizgisini güncellerken Demonun sabit etiketini veya commit'ini de güncelleyin ve doğrulamayı yeniden yapın. Demo API anahtarları, OTLP kimlik doğrulama üstbilgileri, dahili projeler, CLI profilleri veya geçmiş traceId'ler içermemelidir.