@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.
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
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:
Bağımlılıkları yükleyin
Kaynak ve içerik toplama ilkesini yapılandırın
OpenTelemetry'yi başlatın
GenAI Span'leri oluşturun (Giriş, Aracı, Adım, LLM, Araç ve diğerleri)
Hataları yönetin ve Span'leri kapatın
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.namedeğ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.
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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.idgen_ai.user.idgen_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.idvegen_ai.agent.namedevralı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_idkullanı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=LLMvegen_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.4telemetry.sdk.name=cms_node_sdkve doğruservice.nameiç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:
İz doğru bölge, doğru uygulama ve doğru
service.namealtında alınabilir.Çağrı zinciri ağacı iş yürütme sırasıyla eşleşir.
Tek bir model isteğinde yalnızca bir LLM Span'i vardır.
Her GenAI Span'i doğru
gen_ai.span.kindvegen_ai.operation.namedeğerine sahiptir.LLM
gen_ai.request.model, girdi/çıktı/toplam tokenları içerir.Aracı tokenları içerdiği model çağrılarının toplamına eşittir.
Araç ad, çağrı kimliği, bağımsız değişkenler ve sonuç içerir.
İçerik toplama etkinleştirildiğinde ikinci tur LLM girdisi hem araç çağrısını hem de araç yanıtını içerir.
Giriş, Aracı, Adım, LLM ve Araç oturum/kullanıcı/aracı genel özniteliklerine sahiptir.
Başarısızlık durumunda açık kalan tüm Span'ler Hata olarak işaretlenir.
Görüntü doğrulamasında
gen_ai.input.messagestype=uri,mime_type,modalityve gerçek bir URL içerir.gen_ai.input.multimodal_metadatabir JSON dizisidir ve yalnızca URI Parçalarını özetler.Olay Günlüğü doğrulamasında
gen_ai.output.messagesvegen_ai.output.multimodal_metadataçıktı URI'lerini içerir vemime_typekullanır.Mesaj JSON'ında ve meta verilerde kalan
mimeType/fileIdyoktur.otel.scope.versiongerçekten yüklenen npm sürümüyle eşleşir.Kaynak
service.name,acs.arms.service.feature=genai_appvegen_ai.instrumentation.sdk.name=loongsuite-genai-utilsiç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.0propagator 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 birTextMapGetterkullanı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.0hatalı biçimlendirilmişuber-trace-idveyauberctx-*ü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 kombinasyonuylaOTEL_PROPAGATORS=jaegerayarlamayı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.namedeğerini doğrulayın.ConsoleSpanExporteryerine bir OTLP Exporter kullandığınızı onaylayın.Süreç çıkmadan önce
forceFlush()veshutdown()ç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/registeriçerdiğini ve probunopenaiöncesinde yüklendiğini onaylayın.@loongsuite/cms_node_sdk@1.0.4yalnızcaopenai >=4 <6desteğini bildirir. OpenAI 6 doğrulanan aralıkta değildir.Başlatma günlüğünün
openaiizlemesini 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
contextTokengeç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.0olduğunu onaylayın. Sonraki sürümleri kullanırken tam doğrulamayı yeniden çalıştırın.İçerik toplama modunun
SPAN_ONLYveyaSPAN_AND_EVENTolduğ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,modalityveurideğerlerini kontrol edin.Olay Günlüğü girdisi için Şema alanları
mime_type,modalityveurideğerlerini kontrol edin.invocation.attributesdeğ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_typeve 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.