Gateway
การส่งออก OpenTelemetry
OpenClaw ส่งออกข้อมูลวินิจฉัยผ่าน Plugin อย่างเป็นทางการ diagnostics-otel
โดยใช้ OTLP/HTTP (protobuf) นอกจากนี้ยังสามารถเขียนบันทึกเป็น JSONL ไปยัง stdout
สำหรับไปป์ไลน์บันทึกของคอนเทนเนอร์และแซนด์บ็อกซ์ได้ ตัวรวบรวมหรือแบ็กเอนด์ใด ๆ ที่รองรับ
OTLP/HTTP สามารถใช้งานได้โดยไม่ต้องแก้ไขโค้ด สำหรับบันทึกไฟล์ภายในเครื่อง โปรดดู
การบันทึก
- เหตุการณ์วินิจฉัย คือระเบียนแบบมีโครงสร้างภายในโปรเซสที่ Gateway และ Plugin ที่รวมมาให้ปล่อยออกมาสำหรับการเรียกใช้โมเดล โฟลว์ข้อความ เซสชัน คิว และการดำเนินการคำสั่ง
diagnostics-otelสมัครรับเหตุการณ์เหล่านั้นและส่งออกเป็น เมตริก, เทรซ และ บันทึก ของ OpenTelemetry ผ่าน OTLP/HTTP และสามารถ ทำสำเนาระเบียนบันทึกไปยัง stdout ในรูปแบบ JSONL ได้- การเรียกผู้ให้บริการ จะได้รับส่วนหัว W3C
traceparentจากบริบทสแปน การเรียกโมเดลที่เชื่อถือได้ของ OpenClaw เมื่อทรานสปอร์ตของผู้ให้บริการรองรับส่วนหัว แบบกำหนดเอง บริบทเทรซที่ Plugin ปล่อยออกมาจะไม่ถูกส่งต่อ - ตัวส่งออกจะเชื่อมต่อเฉพาะเมื่อเปิดใช้งานทั้งส่วนการวินิจฉัยและ Plugin ดังนั้นโดยค่าเริ่มต้น ต้นทุนภายในโปรเซสจึงเกือบเป็นศูนย์
เริ่มต้นอย่างรวดเร็ว
openclaw plugins install clawhub:@openclaw/diagnostics-otel{ plugins: { allow: ["diagnostics-otel"], entries: { "diagnostics-otel": { enabled: true }, }, }, diagnostics: { enabled: true, otel: { enabled: true, endpoint: "http://otel-collector:4318", protocol: "http/protobuf", serviceName: "openclaw-gateway", traces: true, metrics: true, logs: true, sampleRate: 0.2, flushIntervalMs: 60000, }, },}หรือเปิดใช้งาน Plugin จาก CLI: openclaw plugins enable diagnostics-otel
สัญญาณที่ส่งออก
| สัญญาณ | ข้อมูลที่อยู่ในสัญญาณ |
|---|---|
| เมตริก | ตัวนับ/ฮิสโตแกรมสำหรับการใช้โทเค็น ค่าใช้จ่าย ระยะเวลาการเรียกใช้ การสลับไปใช้ระบบสำรอง การใช้สกิล โฟลว์ข้อความ เหตุการณ์การสนทนา เลนคิว สถานะ/การกู้คืนเซสชัน การเรียกใช้เครื่องมือ การดำเนินการคำสั่ง หน่วยความจำ สถานะการทำงาน และสถานะตัวส่งออก |
| เทรซ | สแปนสำหรับการใช้โมเดล การเรียกโมเดล วงจรชีวิตของฮาร์เนส การใช้สกิล การเรียกใช้เครื่องมือ การดำเนินการคำสั่ง การประมวลผล Webhook/ข้อความ การประกอบบริบท และลูปเครื่องมือ |
| บันทึก | ระเบียน logging.file แบบมีโครงสร้างที่ส่งออกผ่าน OTLP หรือ stdout JSONL เมื่อเปิดใช้งาน diagnostics.otel.logs โดยจะไม่ส่งออกเนื้อหาบันทึก เว้นแต่เปิดใช้งานการเก็บเนื้อหาอย่างชัดเจน |
เปิดหรือปิด traces, metrics และ logs แยกจากกันได้ เทรซและเมตริก
จะเปิดโดยค่าเริ่มต้นเมื่อ diagnostics.otel.enabled เป็น true ส่วนบันทึกจะปิด
โดยค่าเริ่มต้นและส่งออกเฉพาะเมื่อกำหนด diagnostics.otel.logs เป็น true
อย่างชัดเจน การส่งออกบันทึกใช้ OTLP โดยค่าเริ่มต้น ให้กำหนด
diagnostics.otel.logsExporter เป็น stdout สำหรับ JSONL บน stdout หรือ
both สำหรับทั้งสองแบบ
ข้อมูลอ้างอิงการกำหนดค่า
{ diagnostics: { enabled: true, otel: { enabled: true, endpoint: "http://otel-collector:4318", tracesEndpoint: "http://otel-collector:4318/v1/traces", metricsEndpoint: "http://otel-collector:4318/v1/metrics", logsEndpoint: "http://otel-collector:4318/v1/logs", protocol: "http/protobuf", // grpc ปิดใช้งานการส่งออก OTLP serviceName: "openclaw-gateway", // หากไม่ได้กำหนด จะใช้ OTEL_SERVICE_NAME แล้วจึงใช้ "openclaw" headers: { "x-collector-token": "..." }, traces: true, metrics: true, logs: true, logsExporter: "otlp", // otlp | stdout | both sampleRate: 0.2, // ตัวสุ่มตัวอย่างสแปนราก, 0.0..1.0 flushIntervalMs: 60000, // ช่วงเวลาส่งออกเมตริก (ขั้นต่ำ 1000ms) captureContent: { enabled: false, inputMessages: false, outputMessages: false, toolInputs: false, toolOutputs: false, systemPrompt: false, toolDefinitions: false, }, }, },}ตัวแปรสภาพแวดล้อม
| ตัวแปร | วัตถุประสงค์ |
|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT |
ค่าสำรองสำหรับ diagnostics.otel.endpoint เมื่อไม่ได้กำหนดคีย์การกำหนดค่า |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT / OTEL_EXPORTER_OTLP_METRICS_ENDPOINT / OTEL_EXPORTER_OTLP_LOGS_ENDPOINT |
ค่าสำรองของปลายทางเฉพาะสัญญาณที่ใช้เมื่อไม่ได้กำหนดคีย์การกำหนดค่า diagnostics.otel.*Endpoint ที่ตรงกัน การกำหนดค่าเฉพาะสัญญาณมีลำดับความสำคัญเหนือ env เฉพาะสัญญาณ และ env เฉพาะสัญญาณมีลำดับความสำคัญเหนือปลายทางที่ใช้ร่วมกัน |
OTEL_SERVICE_NAME |
ค่าสำรองสำหรับ diagnostics.otel.serviceName เมื่อไม่ได้กำหนดคีย์การกำหนดค่า ชื่อบริการเริ่มต้นคือ openclaw |
OTEL_EXPORTER_OTLP_PROTOCOL |
ค่าสำรองสำหรับโปรโตคอลระดับสายสื่อสารเมื่อไม่ได้กำหนด diagnostics.otel.protocol เฉพาะ http/protobuf เท่านั้นที่เปิดใช้งานการส่งออก |
OTEL_SEMCONV_STABILITY_OPT_IN |
กำหนดเป็น gen_ai_latest_experimental เพื่อปล่อยโครงสร้างสแปนการอนุมาน GenAI ล่าสุด ได้แก่ ชื่อสแปน {gen_ai.operation.name} {gen_ai.request.model}, ชนิดสแปน CLIENT และ gen_ai.provider.name แทน gen_ai.system แบบเดิม เมตริก GenAI จะใช้แอตทริบิวต์แบบจำกัดและมีคาร์ดินัลลิตีต่ำเสมอ |
OPENCLAW_OTEL_PRELOADED |
กำหนดเป็น 1 เมื่อพรีโหลดหรือโปรเซสโฮสต์อื่นได้ลงทะเบียน OpenTelemetry SDK ส่วนกลางไว้แล้ว จากนั้น Plugin จะข้ามวงจรชีวิต NodeSDK ของตนเอง แต่ยังคงเชื่อมต่อตัวรับฟังข้อมูลวินิจฉัยและปฏิบัติตาม traces/metrics/logs |
ความเป็นส่วนตัวและการเก็บเนื้อหา
โดยค่าเริ่มต้น จะไม่ส่งออกเนื้อหาดิบของโมเดล/เครื่องมือ สแปนจะมีเฉพาะ
ตัวระบุแบบจำกัด (ช่องทาง ผู้ให้บริการ โมเดล หมวดหมู่ข้อผิดพลาด รหัสคำขอแบบแฮชเท่านั้น
แหล่งที่มาของเครื่องมือ เจ้าของเครื่องมือ ชื่อ/แหล่งที่มาของสกิล) และจะไม่มีข้อความพรอมต์
ข้อความตอบกลับ อินพุตเครื่องมือ เอาต์พุตเครื่องมือ พาธไฟล์สกิล หรือคีย์เซสชัน
ค่าที่มีลักษณะเหมือนคีย์เซสชันของเอเจนต์แบบมีขอบเขต (เช่น ขึ้นต้นด้วย
agent:) จะถูกแทนที่ด้วย unknown ในแอตทริบิวต์ที่มีคาร์ดินัลลิตีต่ำ โดยค่าเริ่มต้น
ระเบียนบันทึก OTLP จะเก็บระดับความรุนแรง ตัวบันทึก ตำแหน่งโค้ด บริบทเทรซ
ที่เชื่อถือได้ และแอตทริบิวต์ที่ผ่านการกรองแล้ว ส่วนเนื้อหาข้อความบันทึกดิบจะถูกส่งออก
เฉพาะเมื่อ diagnostics.otel.captureContent เป็นค่าบูลีน true เท่านั้น คีย์ย่อย
captureContent.* แบบละเอียดจะไม่เปิดใช้งานเนื้อหาบันทึก เมตริกการสนทนาจะส่งออก
เฉพาะข้อมูลเมตาของเหตุการณ์แบบจำกัด (โหมด ทรานสปอร์ต ผู้ให้บริการ ประเภทเหตุการณ์)
โดยไม่มีบทถอดเสียง เพย์โหลดเสียง รหัสเซสชัน รหัสเทิร์น รหัสการเรียก รหัสห้อง
หรือโทเค็นการส่งต่อ
คำขอโมเดลขาออกอาจมีส่วนหัว W3C traceparent ที่สร้างขึ้นเฉพาะ
จากบริบทเทรซการวินิจฉัยที่ OpenClaw เป็นเจ้าของสำหรับการเรียกโมเดลที่ทำงานอยู่
ส่วนหัว traceparent ที่ผู้เรียกกำหนดไว้จะถูกแทนที่ ดังนั้น Plugin หรือ
ตัวเลือกผู้ให้บริการแบบกำหนดเองจึงไม่สามารถปลอมแปลงลำดับบรรพบุรุษของเทรซข้ามบริการได้
กำหนด diagnostics.otel.captureContent.* เป็น true เฉพาะเมื่อตัวรวบรวม
และนโยบายการเก็บรักษาของคุณได้รับอนุมัติให้จัดเก็บข้อความพรอมต์ การตอบกลับ เครื่องมือ
หรือพรอมต์ระบบ แต่ละคีย์ย่อยทำงานแยกจากกัน:
inputMessages- เนื้อหาพรอมต์ของผู้ใช้outputMessages- เนื้อหาการตอบกลับของโมเดลtoolInputs- เพย์โหลดอาร์กิวเมนต์ของเครื่องมือtoolOutputs- เพย์โหลดผลลัพธ์ของเครื่องมือsystemPrompt- พรอมต์ระบบ/นักพัฒนาที่ประกอบเสร็จแล้วtoolDefinitions- ชื่อ คำอธิบาย และสคีมาของเครื่องมือสำหรับโมเดล
เมื่อเปิดใช้งานคีย์ย่อยใด ๆ สแปนของโมเดลและเครื่องมือจะได้รับแอตทริบิวต์
openclaw.content.* ที่มีขอบเขตจำกัดและผ่านการปกปิดข้อมูล เฉพาะสำหรับคลาสนั้น
เนื้อหา toolInputs/toolOutputs จะถูกเก็บสำหรับการเรียกใช้เครื่องมือของ
รันไทม์เอเจนต์ในตัว (openclaw.content.tool_input และ
gen_ai.tool.call.arguments บนสแปนที่เสร็จสมบูรณ์/เกิดข้อผิดพลาด
openclaw.content.tool_output และ gen_ai.tool.call.result บนสแปน
ที่เสร็จสมบูรณ์) ชื่อ openclaw.content.* ยังคงเป็นชื่อแอตทริบิวต์ OpenClaw
ที่เสถียร ส่วนสำเนา gen_ai.tool.call.* สะท้อนค่าเดียวกันสำหรับโปรแกรมดู
ที่รองรับ semconv โดยตรง การเรียกเครื่องมือของฮาร์เนสภายนอก (Codex, Claude CLI)
จะปล่อยสแปน tool.execution.* โดยไม่มีเพย์โหลดเนื้อหา เนื้อหาที่เก็บจะเดินทางผ่าน
ช่องทางที่เชื่อถือได้และมีไว้สำหรับตัวรับฟังเท่านั้น และจะไม่ถูกวางบนบัสเหตุการณ์
วินิจฉัยสาธารณะ
การสุ่มตัวอย่างและการฟลัช
- เทรซ:
diagnostics.otel.sampleRateกำหนดTraceIdRatioBasedSamplerเฉพาะในสแปนราก (0.0ทิ้งทั้งหมด,1.0เก็บทั้งหมด) หากไม่กำหนดจะใช้ค่าเริ่มต้น ของ OpenTelemetry SDK (เปิดใช้งานเสมอ) - เมตริก:
diagnostics.otel.flushIntervalMs(จำกัดค่าต่ำสุดไว้ที่1000); หากไม่กำหนดจะใช้ค่าเริ่มต้นของการส่งออกเป็นระยะของ SDK - บันทึก: บันทึก OTLP ใช้
logging.level(ระดับบันทึกของไฟล์) และใช้เส้นทาง การปกปิดข้อมูลของระเบียนบันทึกการวินิจฉัย ไม่ใช่การจัดรูปแบบคอนโซล การติดตั้งที่มีปริมาณสูง ควรเลือกใช้การสุ่มตัวอย่าง/การกรองของตัวรวบรวม OTLP แทนการสุ่มตัวอย่าง ภายในเครื่อง ตั้งค่าdiagnostics.otel.logsExporter: "stdout"เมื่อแพลตฟอร์มของคุณ ส่ง stdout/stderr ไปยังตัวประมวลผลบันทึกอยู่แล้วและคุณไม่มีตัวรวบรวมบันทึก OTLP ระเบียน stdout เป็นออบเจ็กต์ JSON หนึ่งรายการต่อบรรทัด โดยมีts,signal,service.name, ระดับความรุนแรง, เนื้อหา, แอตทริบิวต์ที่ปกปิดข้อมูลแล้ว และฟิลด์เทรซ ที่เชื่อถือได้เมื่อมี - การเชื่อมโยงบันทึกไฟล์: บันทึกไฟล์ JSONL มี
traceId,spanId,parentSpanIdและtraceFlagsที่ระดับบนสุด เมื่อการเรียกบันทึกมีบริบท เทรซการวินิจฉัยที่ถูกต้อง ซึ่งช่วยให้ตัวประมวลผลบันทึกเชื่อมบรรทัดบันทึกภายในเครื่องกับ สแปนที่ส่งออกได้ - การเชื่อมโยงคำขอ: คำขอ HTTP และเฟรม WebSocket ของ Gateway จะสร้าง
ขอบเขตเทรซคำขอภายใน โดยค่าเริ่มต้น บันทึกและเหตุการณ์การวินิจฉัยภายใน
ขอบเขตนั้นจะสืบทอดเทรซคำขอ ขณะที่สแปนการทำงานของเอเจนต์และการเรียกโมเดล
จะถูกสร้างเป็นลูก เพื่อให้ส่วนหัว
traceparentของผู้ให้บริการอยู่ใน เทรซเดียวกัน - การเชื่อมโยงการเรียกโมเดล: สแปน
openclaw.model.callมีขนาดคอมโพเนนต์ พรอมต์ที่ปลอดภัยโดยค่าเริ่มต้น และมีแอตทริบิวต์โทเค็นต่อการเรียกเมื่อผลลัพธ์จากผู้ให้บริการ เปิดเผยข้อมูลการใช้งานopenclaw.model.usageยังคงเป็นสแปนการบัญชี ระดับการทำงานสำหรับต้นทุนรวม บริบท และแดชบอร์ดช่องทาง และยังคงอยู่ใน เทรซการวินิจฉัยเดียวกันเมื่อรันไทม์ที่ปล่อยข้อมูลมีบริบทเทรซที่เชื่อถือได้
เมตริกที่ส่งออก
การใช้งานโมเดล
openclaw.tokens(ตัวนับ, แอตทริบิวต์:openclaw.token,openclaw.channel,openclaw.provider,openclaw.model,openclaw.agent)openclaw.cost.usd(ตัวนับ, แอตทริบิวต์:openclaw.channel,openclaw.provider,openclaw.model)openclaw.run.duration_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.channel,openclaw.provider,openclaw.model)openclaw.context.tokens(ฮิสโตแกรม, แอตทริบิวต์:openclaw.context,openclaw.channel,openclaw.provider,openclaw.model)gen_ai.client.token.usage(ฮิสโตแกรม, เมตริกตามข้อกำหนดเชิงความหมายของ GenAI, แอตทริบิวต์:gen_ai.token.type=input/output,gen_ai.provider.name,gen_ai.operation.name,gen_ai.request.model)gen_ai.client.operation.duration(ฮิสโตแกรม, วินาที, เมตริกตามข้อกำหนดเชิงความหมายของ GenAI, แอตทริบิวต์:gen_ai.provider.name,gen_ai.operation.name,gen_ai.request.model,error.typeซึ่งเป็นตัวเลือก)openclaw.model_call.duration_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.provider,openclaw.model,openclaw.api,openclaw.transportรวมถึงopenclaw.errorCategoryและopenclaw.failureKindสำหรับข้อผิดพลาดที่ได้รับการจำแนก)openclaw.model_call.request_bytes(ฮิสโตแกรม, ขนาดไบต์ UTF-8 ของเพย์โหลดคำขอโมเดลสุดท้าย; ไม่มีเนื้อหาเพย์โหลดดิบ)openclaw.model_call.response_bytes(ฮิสโตแกรม, ขนาดไบต์ UTF-8 ของเพย์โหลดชิ้นส่วนการตอบกลับแบบสตรีม; เดลตาของข้อความ การคิด และการเรียกเครื่องมือที่มีความถี่สูงจะนับเฉพาะไบต์deltaส่วนเพิ่ม; ไม่มีเนื้อหาการตอบกลับดิบ)openclaw.model_call.time_to_first_byte_ms(ฮิสโตแกรม, เวลาที่ผ่านไปก่อนเหตุการณ์การตอบกลับแบบสตรีมครั้งแรก)openclaw.model.failover(ตัวนับ, แอตทริบิวต์:openclaw.provider,openclaw.model,openclaw.failover.to_provider,openclaw.failover.to_model,openclaw.failover.reason,openclaw.failover.suspended,openclaw.lane)openclaw.skill.used(ตัวนับ, แอตทริบิวต์:openclaw.skill.name,openclaw.skill.source,openclaw.skill.activation,openclaw.agentซึ่งเป็นตัวเลือก,openclaw.toolNameซึ่งเป็นตัวเลือก)
ลำดับการไหลของข้อความ
openclaw.webhook.received(ตัวนับ, แอตทริบิวต์:openclaw.channel,openclaw.webhook)openclaw.webhook.error(ตัวนับ, แอตทริบิวต์:openclaw.channel,openclaw.webhook)openclaw.webhook.duration_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.channel,openclaw.webhook)openclaw.message.queued(ตัวนับ, แอตทริบิวต์:openclaw.channel,openclaw.source)openclaw.message.received(ตัวนับ, แอตทริบิวต์:openclaw.channel,openclaw.source)openclaw.message.dispatch.started(ตัวนับ, แอตทริบิวต์:openclaw.channel,openclaw.source)openclaw.message.dispatch.completed(ตัวนับ, แอตทริบิวต์:openclaw.channel,openclaw.outcome,openclaw.reason,openclaw.source)openclaw.message.dispatch.duration_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.channel,openclaw.outcome,openclaw.reason,openclaw.source)openclaw.message.processed(ตัวนับ, แอตทริบิวต์:openclaw.channel,openclaw.outcome)openclaw.message.duration_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.channel,openclaw.outcome)openclaw.message.delivery.started(ตัวนับ, แอตทริบิวต์:openclaw.channel,openclaw.delivery.kind)openclaw.message.delivery.duration_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.channel,openclaw.delivery.kind,openclaw.outcome,openclaw.errorCategory)
การสนทนา
openclaw.talk.event(ตัวนับ, แอตทริบิวต์:openclaw.talk.event_type,openclaw.talk.mode,openclaw.talk.transport,openclaw.talk.brain,openclaw.talk.provider)openclaw.talk.event.duration_ms(ฮิสโตแกรม, แอตทริบิวต์: เหมือนกับopenclaw.talk.event; ปล่อยเมื่อเหตุการณ์การสนทนารายงานระยะเวลา)openclaw.talk.audio.bytes(ฮิสโตแกรม, แอตทริบิวต์: เหมือนกับopenclaw.talk.event; ปล่อยสำหรับเหตุการณ์เฟรมเสียงการสนทนาที่รายงานความยาวเป็นไบต์)
คิวและเซสชัน
openclaw.queue.lane.enqueue(ตัวนับ, แอตทริบิวต์:openclaw.lane)openclaw.queue.lane.dequeue(ตัวนับ, แอตทริบิวต์:openclaw.lane)openclaw.queue.depth(ฮิสโตแกรม, แอตทริบิวต์:openclaw.laneหรือopenclaw.channel=heartbeat)openclaw.queue.wait_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.lane)openclaw.session.state(ตัวนับ, แอตทริบิวต์:openclaw.state,openclaw.reason)openclaw.session.stuck(ตัวนับ, แอตทริบิวต์:openclaw.state; ปล่อยสำหรับข้อมูลบันทึกสถานะเซสชันที่ล้าสมัยและกู้คืนได้)openclaw.session.stuck_age_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.state; ปล่อยสำหรับข้อมูลบันทึกสถานะเซสชันที่ล้าสมัยและกู้คืนได้)openclaw.session.turn.created(ตัวนับ, แอตทริบิวต์:openclaw.agent,openclaw.channel,openclaw.trigger)openclaw.session.recovery.requested(ตัวนับ, แอตทริบิวต์:openclaw.state,openclaw.action,openclaw.active_work_kind,openclaw.reason)openclaw.session.recovery.completed(ตัวนับ, แอตทริบิวต์:openclaw.state,openclaw.action,openclaw.status,openclaw.active_work_kind,openclaw.reason)openclaw.session.recovery.age_ms(ฮิสโตแกรม, แอตทริบิวต์: เหมือนกับตัวนับการกู้คืนที่ตรงกัน)openclaw.run.attempt(ตัวนับ, แอตทริบิวต์:openclaw.attempt)
เทเลเมทรีความพร้อมทำงานของเซสชัน
diagnostics.stuckSessionWarnMs คือเกณฑ์อายุที่ไม่มีความคืบหน้าสำหรับการวินิจฉัย
ความพร้อมทำงานของเซสชัน เซสชัน processing จะไม่นับอายุเข้าใกล้
เกณฑ์นี้ขณะที่ OpenClaw สังเกตเห็นความคืบหน้าของการตอบกลับ เครื่องมือ สถานะ บล็อก หรือรันไทม์
ACP การส่งสัญญาณคงสถานะการพิมพ์ไม่นับเป็นความคืบหน้า ดังนั้นจึงยังตรวจพบโมเดลหรือ
ชุดควบคุมที่เงียบอยู่ได้
OpenClaw จำแนกเซสชันตามงานที่ยังสามารถสังเกตได้:
session.long_running: งานฝังตัวที่ทำงานอยู่ การเรียกโมเดล หรือการเรียกเครื่องมือ ยังคงมีความคืบหน้า การเรียกโมเดลที่มีเจ้าของและยังคงเงียบเกินdiagnostics.stuckSessionWarnMsจะถูกรายงานว่าใช้เวลานานก่อนถึงdiagnostics.stuckSessionAbortMsเช่นกัน เพื่อให้ผู้ให้บริการโมเดลที่ช้าหรือไม่ใช้สตรีม ไม่ดูเหมือนเซสชัน Gateway ที่หยุดชะงัก ขณะที่ยังสามารถสังเกตการยกเลิกได้session.stalled: มีงานที่ทำงานอยู่ แต่การทำงานที่ใช้งานอยู่ไม่ได้รายงาน ความคืบหน้าล่าสุด การเรียกโมเดลที่มีเจ้าของจะเปลี่ยนจากsession.long_runningเป็นsession.stalledเมื่อถึงหรือหลังdiagnostics.stuckSessionAbortMs; กิจกรรม โมเดล/เครื่องมือที่ล้าสมัยและไม่มีเจ้าของจะไม่ถูกมองว่าเป็นงานที่ใช้เวลานานโดยไม่เป็นอันตราย ในตอนแรก การทำงานฝังตัวที่หยุดชะงักจะอยู่ในโหมดสังเกตเท่านั้น จากนั้นจะยกเลิกและระบายงานหลังdiagnostics.stuckSessionAbortMsหากไม่มีความคืบหน้า เพื่อให้เทิร์นที่รออยู่ ด้านหลังในเลนสามารถทำงานต่อได้ หากไม่กำหนด เกณฑ์การยกเลิกจะใช้ค่าเริ่มต้นเป็นช่วงเวลา ขยายที่ปลอดภัยกว่า ซึ่งมีค่าอย่างน้อย 5 นาทีและ 3 เท่าของdiagnostics.stuckSessionWarnMssession.stuck: ข้อมูลบันทึกสถานะเซสชันล้าสมัยโดยไม่มีงานที่ทำงานอยู่ หรือเซสชัน ในคิวที่ว่างอยู่ซึ่งมีกิจกรรมโมเดล/เครื่องมือที่ล้าสมัยและไม่มีเจ้าของ การดำเนินการนี้จะปล่อย เลนของเซสชันที่ได้รับผลกระทบทันทีหลังผ่านเกตการกู้คืน
การกู้คืนจะปล่อยเหตุการณ์ session.recovery.requested และ
session.recovery.completed แบบมีโครงสร้าง สถานะเซสชันการวินิจฉัยจะถูกทำเครื่องหมายว่าว่าง
หลังจากผลลัพธ์การกู้คืนที่เปลี่ยนแปลงสถานะ (aborted หรือ released) เท่านั้น และต่อเมื่อ
รุ่นการประมวลผลเดิมยังคงเป็นรุ่นปัจจุบัน
เฉพาะ session.stuck เท่านั้นที่ปล่อยตัวนับ openclaw.session.stuck,
ฮิสโตแกรม openclaw.session.stuck_age_ms และสแปน openclaw.session.stuck
การวินิจฉัย session.stuck ที่เกิดซ้ำจะเว้นช่วงเพิ่มขึ้นขณะที่เซสชันยังคง
ไม่เปลี่ยนแปลง ดังนั้นแดชบอร์ดควรแจ้งเตือนเมื่อมีการเพิ่มขึ้นอย่างต่อเนื่อง แทนที่จะเป็น
ทุกจังหวะ Heartbeat สำหรับตัวเลือกการกำหนดค่าและค่าเริ่มต้น โปรดดู
ข้อมูลอ้างอิงการกำหนดค่า
คำเตือนความพร้อมทำงานยังปล่อยข้อมูลต่อไปนี้:
openclaw.liveness.warning(ตัวนับ, แอตทริบิวต์:openclaw.liveness.reason)openclaw.liveness.event_loop_delay_p99_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.liveness.reason)openclaw.liveness.event_loop_delay_max_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.liveness.reason)openclaw.liveness.event_loop_utilization(ฮิสโตแกรม, แอตทริบิวต์:openclaw.liveness.reason)openclaw.liveness.cpu_core_ratio(ฮิสโตแกรม, แอตทริบิวต์:openclaw.liveness.reason)
วงจรชีวิตของชุดควบคุม
openclaw.harness.duration_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.harness.id,openclaw.harness.plugin,openclaw.outcome,openclaw.harness.phaseเมื่อเกิดข้อผิดพลาด)
การดำเนินการเครื่องมือและการตรวจจับลูป
openclaw.tool.execution.duration_ms(ฮิสโตแกรม, แอตทริบิวต์:gen_ai.tool.name,openclaw.toolName,openclaw.tool.source,openclaw.tool.owner,openclaw.tool.params.kindรวมถึงopenclaw.errorCategoryเมื่อเกิดข้อผิดพลาด)openclaw.tool.execution.blocked(ตัวนับ, แอตทริบิวต์:gen_ai.tool.name,openclaw.toolName,openclaw.tool.source,openclaw.tool.owner,openclaw.tool.params.kind,openclaw.deniedReason)openclaw.tool.loop(ตัวนับ, แอตทริบิวต์:openclaw.toolName,openclaw.loop.level,openclaw.loop.action,openclaw.loop.detector,openclaw.loop.count,openclaw.loop.paired_toolซึ่งเป็นตัวเลือก; ปล่อยเมื่อตรวจพบลูปการเรียกเครื่องมือซ้ำ)
การดำเนินคำสั่ง
openclaw.exec.duration_ms(ฮิสโตแกรม, แอตทริบิวต์:openclaw.exec.target,openclaw.exec.mode,openclaw.outcome,openclaw.failureKind)
กลไกภายในของการวินิจฉัย (หน่วยความจำ เพย์โหลด และสถานะของตัวส่งออก)
openclaw.payload.large(ตัวนับ, แอตทริบิวต์:openclaw.payload.surface,openclaw.payload.action,openclaw.channel,openclaw.plugin,openclaw.reason)openclaw.payload.large_bytes(ฮิสโตแกรม, แอตทริบิวต์: เหมือนกับopenclaw.payload.large)openclaw.memory.rss_bytes/openclaw.memory.heap_used_bytes/openclaw.memory.heap_total_bytes/openclaw.memory.external_bytes/openclaw.memory.array_buffers_bytes(ฮิสโตแกรม, ไม่มีแอตทริบิวต์; ตัวอย่างหน่วยความจำของกระบวนการ)openclaw.memory.pressure(ตัวนับ, แอตทริบิวต์:openclaw.memory.level,openclaw.memory.reason)openclaw.diagnostic.async_queue.dropped(ตัวนับ, แอตทริบิวต์:openclaw.diagnostic.async_queue.drop_class; รายการที่ถูกทิ้งเนื่องจากแรงดันย้อนกลับของคิวการวินิจฉัยภายใน)openclaw.telemetry.exporter.events(ตัวนับ, แอตทริบิวต์:openclaw.exporter,openclaw.signal,openclaw.status,openclaw.reasonซึ่งเป็นตัวเลือก,openclaw.errorCategoryซึ่งเป็นตัวเลือก; เทเลเมทรีภายในสำหรับวงจรชีวิต/ความล้มเหลวของตัวส่งออก)
สแปนที่ส่งออก
openclaw.model.usageopenclaw.channel,openclaw.provider,openclaw.modelopenclaw.tokens.*(input/output/cache_read/cache_write/total)- ใช้
gen_ai.systemโดยค่าเริ่มต้น หรือgen_ai.provider.nameเมื่อเลือกใช้แบบแผนเชิงความหมาย GenAI ล่าสุด gen_ai.request.model,gen_ai.operation.name,gen_ai.usage.*
openclaw.runopenclaw.outcome,openclaw.channel,openclaw.provider,openclaw.model,openclaw.errorCategory
openclaw.model.call- ใช้
gen_ai.systemโดยค่าเริ่มต้น หรือgen_ai.provider.nameเมื่อเลือกใช้แบบแผนเชิงความหมาย GenAI ล่าสุด gen_ai.request.model,gen_ai.operation.name,openclaw.provider,openclaw.model,openclaw.api,openclaw.transportopenclaw.errorCategory,error.typeและopenclaw.failureKindซึ่งเป็นค่าที่ไม่บังคับเมื่อเกิดข้อผิดพลาดopenclaw.model_call.request_bytes,openclaw.model_call.response_bytes,openclaw.model_call.time_to_first_byte_msopenclaw.model_call.prompt.input_messages_count,openclaw.model_call.prompt.input_messages_chars,openclaw.model_call.prompt.system_prompt_chars,openclaw.model_call.prompt.tool_definitions_count,openclaw.model_call.prompt.tool_definitions_chars,openclaw.model_call.prompt.total_chars(เฉพาะขนาดขององค์ประกอบที่ปลอดภัย ไม่มีข้อความพรอมต์)openclaw.model_call.usage.*และgen_ai.usage.*เมื่อผลลัพธ์ของการเรียกโมเดลมีข้อมูลการใช้งานจากผู้ให้บริการสำหรับการเรียกครั้งนั้น- เหตุการณ์ Span
openclaw.provider.requestพร้อมแอตทริบิวต์openclaw.upstreamRequestIdHash(จำกัดขนาดและอิงแฮช) เมื่อผลลัพธ์จากผู้ให้บริการต้นทางเปิดเผยรหัสคำขอ โดยจะไม่ส่งออกรหัสดิบเด็ดขาด - เมื่อใช้
OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimentalSpan การเรียกโมเดลจะใช้ชื่อ Span การอนุมาน GenAI ล่าสุด{gen_ai.operation.name} {gen_ai.request.model}และชนิด SpanCLIENTแทนopenclaw.model.call
- ใช้
openclaw.harness.runopenclaw.harness.id,openclaw.harness.plugin,openclaw.outcome,openclaw.provider,openclaw.model,openclaw.channel- เมื่อเสร็จสิ้น:
openclaw.harness.result_classification,openclaw.harness.yield_detected,openclaw.harness.items.started,openclaw.harness.items.completed,openclaw.harness.items.active - เมื่อเกิดข้อผิดพลาด:
openclaw.harness.phase,openclaw.errorCategory, และopenclaw.harness.cleanup_failedซึ่งเป็นค่าที่ไม่บังคับ
openclaw.tool.executiongen_ai.tool.name,gen_ai.operation.name(execute_tool),openclaw.toolName,openclaw.tool.source,gen_ai.tool.call.idซึ่งเป็นค่าที่ไม่บังคับ,openclaw.tool.owner,openclaw.tool.params.*openclaw.errorCategory/openclaw.errorCodeซึ่งเป็นค่าที่ไม่บังคับเมื่อเกิดข้อผิดพลาด และopenclaw.deniedReasonกับopenclaw.outcome=blockedเมื่อถูกปฏิเสธโดยนโยบายหรือแซนด์บ็อกซ์
openclaw.execopenclaw.exec.target,openclaw.exec.mode,openclaw.outcome,openclaw.failureKind,openclaw.exec.command_length,openclaw.exec.exit_code,openclaw.exec.exit_signal,openclaw.exec.timed_out
openclaw.webhook.processedopenclaw.channel,openclaw.webhook
openclaw.webhook.erroropenclaw.channel,openclaw.webhook,openclaw.error
openclaw.message.processedopenclaw.channel,openclaw.outcome,openclaw.reason
openclaw.message.deliveryopenclaw.channel,openclaw.delivery.kind,openclaw.outcome,openclaw.errorCategory,openclaw.delivery.result_count
openclaw.session.stuckopenclaw.state,openclaw.ageMs,openclaw.queueDepth
openclaw.context.assembledopenclaw.prompt.size,openclaw.history.size,openclaw.context.tokens,openclaw.errorCategory(ไม่มีเนื้อหาพรอมต์ ประวัติ การตอบกลับ หรือคีย์เซสชัน)
openclaw.tool.loopopenclaw.toolName,openclaw.loop.level,openclaw.loop.action,openclaw.loop.detector,openclaw.loop.count,openclaw.loop.paired_toolซึ่งเป็นค่าที่ไม่บังคับ (ไม่มีข้อความของลูป พารามิเตอร์ หรือผลลัพธ์จากเครื่องมือ)
openclaw.memory.pressureopenclaw.memory.level,openclaw.memory.reason,openclaw.memory.rss_bytes,openclaw.memory.heap_used_bytes,openclaw.memory.heap_total_bytes,openclaw.memory.external_bytes,openclaw.memory.array_buffers_bytes, และopenclaw.memory.threshold_bytes/openclaw.memory.rss_growth_bytes/openclaw.memory.window_msซึ่งเป็นค่าที่ไม่บังคับ
เมื่อเปิดใช้การบันทึกเนื้อหาอย่างชัดเจน Span ของโมเดลและเครื่องมือยังสามารถ
มีแอตทริบิวต์ openclaw.content.* ที่จำกัดขนาดและปกปิดข้อมูลแล้ว สำหรับ
คลาสเนื้อหาเฉพาะที่คุณเลือกใช้
แค็ตตาล็อกเหตุการณ์การวินิจฉัย
เหตุการณ์ด้านล่างรองรับเมตริกและ Span ข้างต้น นอกจากนี้ Plugin ยังสามารถ สมัครรับเหตุการณ์เหล่านี้โดยตรงได้โดยไม่ต้องส่งออกผ่าน OTLP
การใช้งานโมเดล
model.usage- โทเค็น ค่าใช้จ่าย ระยะเวลา บริบท ผู้ให้บริการ/โมเดล/ช่องทาง และรหัสเซสชันusageคือการคิดบัญชีของผู้ให้บริการ/รอบสนทนาสำหรับค่าใช้จ่ายและเทเลเมทรี ส่วนcontext.usedคือสแนปช็อตพรอมต์/บริบทปัจจุบัน และอาจต่ำกว่าusage.totalของผู้ให้บริการเมื่อมีอินพุตที่แคชไว้หรือการเรียกในลูปเครื่องมือ
โฟลว์ข้อความ
webhook.received/webhook.processed/webhook.errormessage.queued/message.processedmessage.delivery.started/message.delivery.completed/message.delivery.error
คิวและเซสชัน
queue.lane.enqueue/queue.lane.dequeuesession.state/session.long_running/session.stalled/session.stuckrun.attempt/run.progressdiagnostic.heartbeat(ตัวนับแบบรวม: Webhook/คิว/เซสชัน)
วงจรการทำงานของฮาร์เนส
harness.run.started/harness.run.completed/harness.run.error- วงจรการทำงานต่อการรันของฮาร์เนสเอเจนต์ ประกอบด้วยharnessId,pluginIdซึ่งเป็นค่าที่ไม่บังคับ, ผู้ให้บริการ/โมเดล/ช่องทาง และรหัสการรัน เมื่อเสร็จสิ้นจะเพิ่มdurationMs,outcome,resultClassificationซึ่งเป็นค่าที่ไม่บังคับ,yieldDetectedและจำนวนitemLifecycleส่วนข้อผิดพลาดจะเพิ่มphase(prepare/start/send/resolve/cleanup),errorCategoryและcleanupFailedซึ่งเป็นค่าที่ไม่บังคับ
การดำเนินการคำสั่ง
exec.process.completed- ผลลัพธ์สุดท้าย ระยะเวลา เป้าหมาย โหมด โค้ด ทางออก และประเภทความล้มเหลว โดยไม่รวมข้อความคำสั่งและไดเรกทอรีทำงานexec.approval.followup_suppressed- ยกเลิกการติดตามผลการอนุมัติที่ล้าสมัย หลังจากเซสชันเชื่อมโยงใหม่ ประกอบด้วยapprovalId,reason(session_rebound),phase(direct_deliveryหรือgateway_preflight) และการประทับเวลาของตัวแจกจ่าย โดยไม่รวมคีย์เซสชัน เส้นทาง และข้อความคำสั่ง
เมื่อไม่มีตัวส่งออก
ทำให้เหตุการณ์การวินิจฉัยพร้อมใช้งานสำหรับ Plugin หรือตัวรับข้อมูลแบบกำหนดเองโดยไม่ต้องเรียกใช้
diagnostics-otel:
{ diagnostics: { enabled: true },}สำหรับเอาต์พุตการดีบักแบบเจาะจงโดยไม่ต้องเพิ่ม logging.level ให้ใช้แฟล็ก
การวินิจฉัย แฟล็กไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ และรองรับไวลด์การ์ด (telegram.* หรือ
*):
{ diagnostics: { flags: ["telegram.http"] },}หรือใช้เป็นการแทนที่ผ่านตัวแปรสภาพแวดล้อมเพียงครั้งเดียว:
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload openclaw gatewayเอาต์พุตของแฟล็กจะถูกส่งไปยังไฟล์บันทึกมาตรฐาน (logging.file) และยังคง
ถูกปกปิดข้อมูลโดย logging.redactSensitive คู่มือฉบับเต็ม:
แฟล็กการวินิจฉัย
ปิดใช้งาน
{ diagnostics: { otel: { enabled: false } },}หรือไม่ต้องใส่ diagnostics-otel ใน plugins.allow หรือเรียกใช้
openclaw plugins disable diagnostics-otel
ที่เกี่ยวข้อง
- การบันทึก - บันทึกไฟล์ เอาต์พุตคอนโซล การติดตามผ่าน CLI และแท็บบันทึกใน Control UI
- กลไกการบันทึกภายในของ Gateway - รูปแบบบันทึก WS คำนำหน้าระบบย่อย และการบันทึกคอนโซล
- แฟล็กการวินิจฉัย - แฟล็กบันทึกการดีบักแบบเจาะจง
- การส่งออกข้อมูลการวินิจฉัย - เครื่องมือชุดข้อมูลสนับสนุนสำหรับผู้ดูแลระบบ (แยกจากการส่งออก OTEL)
- ข้อมูลอ้างอิงการกำหนดค่า - ข้อมูลอ้างอิงฉบับเต็มของฟิลด์
diagnostics.*