promptfoo 0.121.2 → 0.121.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/{ListApp-Du7YVwj5.js → ListApp-DQkFNqE9.js} +1 -1
- package/dist/src/{accounts-B0pgC1oV.js → accounts-DdJ2pHMI.js} +5 -5
- package/dist/src/{accounts-CiBLOnA7.js → accounts-DhMYUUbu.js} +5 -5
- package/dist/src/{accounts-gtkH-5KX.cjs → accounts-Dy17bs4D.cjs} +5 -5
- package/dist/src/{accounts-Bm2D8Db9.js → accounts-F9d_5sMC.js} +6 -6
- package/dist/src/{cometapi-C4xSqeID.cjs → agentic-utils-BpX5b23w.cjs} +24 -62
- package/dist/src/{cometapi-CUQq3H_a.js → agentic-utils-P172hM8B.js} +4 -61
- package/dist/src/agentic-utils-qFlm6zes.js +153 -0
- package/dist/src/{agentic-utils-DS1g3GLF.js → agentic-utils-w68v6_Dz.js} +3 -3
- package/dist/src/{agents-CmvBq8LV.js → agents-8FDnTriG.js} +6 -7
- package/dist/src/{agents-DbRtpYxR.cjs → agents-BahDpe5G.cjs} +255 -20
- package/dist/src/{agents-DgF2zDag.js → agents-C-R_jfzI.js} +255 -20
- package/dist/src/{agents-9qiOy0ho.js → agents-CgaMXvLM.js} +5 -7
- package/dist/src/{agents-Di9DKPzn.cjs → agents-D7-HGxUj.cjs} +5 -7
- package/dist/src/{agents-CBr9A01V.js → agents-DJ35I3Nt.js} +255 -20
- package/dist/src/{agents-cLXA8a_8.js → agents-aYPQLf8W.js} +5 -9
- package/dist/src/{agents-D__IdAlg.js → agents-pQeBEXMm.js} +255 -21
- package/dist/src/{aimlapi-B4rcnZgv.js → aimlapi-BCq3MHeL.js} +8 -14
- package/dist/src/{aimlapi-DHJU_kcV.js → aimlapi-BD6J9oKt.js} +7 -14
- package/dist/src/{aimlapi-BvlNH0gr.cjs → aimlapi-qcK4OT55.cjs} +8 -15
- package/dist/src/{aimlapi-CnkC2HqE.js → aimlapi-sgYnkE54.js} +7 -16
- package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -0
- package/dist/src/app/assets/Report-CQYFezYu.js +1 -0
- package/dist/src/app/assets/index-BXGkeMwh.css +1 -0
- package/dist/src/app/assets/index-BzJt18Jz.js +385 -0
- package/dist/src/app/assets/rolldown-runtime-COnpUsM8.js +1 -0
- package/dist/src/app/assets/scroll-timeline-D9IT_e8Z.js +1 -0
- package/dist/src/app/assets/sync-IjzpWrOE.js +4 -0
- package/dist/src/app/assets/vendor-charts-BNdH8TCw.js +36 -0
- package/dist/src/app/assets/vendor-markdown-Ch00wnNI.js +29 -0
- package/dist/src/app/assets/vendor-react-CVvmk1UB.js +9 -0
- package/dist/src/app/assets/vendor-utils-BnEYbx2Q.js +37 -0
- package/dist/src/app/index.html +7 -7
- package/dist/src/{audio-Dz3z7s3J.js → audio-B7izf48x.js} +4 -5
- package/dist/src/{audio-CGMyULza.cjs → audio-BQtNuYBj.cjs} +4 -4
- package/dist/src/{audio-Bkv46et0.js → audio-COrn8rM6.js} +4 -4
- package/dist/src/{audio-ClI_AFre.js → audio-DcVKoInv.js} +4 -4
- package/dist/src/{base-CGrhspbK.cjs → base-D-670DX8.cjs} +3 -3
- package/dist/src/{base-CpjcHe4e.js → base-PYJvBE1i.js} +3 -3
- package/dist/src/{base-Dy1V8--Z.js → base-fZ9wgg50.js} +3 -3
- package/dist/src/{base-DLKtKMFh.js → base-yrI1Yal4.js} +3 -3
- package/dist/src/{blobs-BDbfYdrJ.js → blobs-BCZavS8s.js} +4 -4
- package/dist/src/{blobs-CMHN0Qcz.js → blobs-BQWqnnvL.js} +4 -4
- package/dist/src/{blobs-CBO20krR.js → blobs-C-F78Kfn.js} +3 -3
- package/dist/src/{blobs-D23XLin-.cjs → blobs-D2FAd1Q5.cjs} +3 -3
- package/dist/src/cache-BIyPcp5v.cjs +376 -0
- package/dist/src/cache-C4Xb-hNb.js +310 -0
- package/dist/src/cache-Cr9oLMUa.js +3 -0
- package/dist/src/cache-D5NZmMiT.js +310 -0
- package/dist/src/cache-DbLsVWB2.cjs +3 -0
- package/dist/src/cache-mb7c8hbp.js +280 -0
- package/dist/src/{chat-C2jrdPMx.js → chat-0bwXjVP0.js} +3 -13
- package/dist/src/{chat-C1Qst7jL.cjs → chat-BPXSW8Bv.cjs} +3 -13
- package/dist/src/{chat-DJIw17u0.js → chat-BfPaS15_.js} +68 -42
- package/dist/src/{chat-CgF-J-Jj.cjs → chat-CclRbxGf.cjs} +68 -42
- package/dist/src/{chat-BiKyneZl.js → chat-Dr3DUQ0D.js} +68 -42
- package/dist/src/{chat-DqxYYtWA.js → chat-I9izLm49.js} +67 -41
- package/dist/src/{chat-CzkrVDfz.js → chat-MKxMnZJZ.js} +3 -13
- package/dist/src/{chat-qmatte1u.js → chat-mW0ORo8G.js} +3 -14
- package/dist/src/{chatkit-DKyPi1Gs.cjs → chatkit-BoWoSgXl.cjs} +4 -4
- package/dist/src/{chatkit-65VXf5SR.js → chatkit-CJnHRRMM.js} +4 -4
- package/dist/src/{chatkit-Be-Q-a9F.js → chatkit-Cv6AhukM.js} +4 -4
- package/dist/src/{chatkit-BxFvW8KY.js → chatkit-zUIVoDos.js} +4 -4
- package/dist/src/{claude-agent-sdk-Apiy0iaz.js → claude-agent-sdk-BQNuLaAK.js} +41 -18
- package/dist/src/{claude-agent-sdk-D9Z5Pr9X.cjs → claude-agent-sdk-CPJo3dBQ.cjs} +45 -22
- package/dist/src/{claude-agent-sdk-D2bJee9S.js → claude-agent-sdk-Dtq_L-Sc.js} +40 -17
- package/dist/src/{claude-agent-sdk-DfCoW0E6.js → claude-agent-sdk-nfAIcxNf.js} +42 -20
- package/dist/src/{cloud-C0dlstV_.js → cloud-DQZ5sVjW.js} +25 -13
- package/dist/src/cloud-Hphvo8kr.js +3 -0
- package/dist/src/{cloudflare-ai-8TDxHR0x.js → cloudflare-ai-BIB567w6.js} +5 -14
- package/dist/src/{cloudflare-ai-g7PB6VHR.js → cloudflare-ai-DGLte7Py.js} +5 -14
- package/dist/src/{cloudflare-ai-CknbZ5LJ.cjs → cloudflare-ai-Dl3N9OVD.cjs} +6 -15
- package/dist/src/{cloudflare-ai-BxAGvfju.js → cloudflare-ai-DlKr0rY7.js} +5 -15
- package/dist/src/{cloudflare-gateway-B9HWA5wf.js → cloudflare-gateway-BDZrYydE.js} +4 -16
- package/dist/src/{cloudflare-gateway-BSnDmHYo.cjs → cloudflare-gateway-BYDp495F.cjs} +4 -15
- package/dist/src/{cloudflare-gateway-CKDb4dJ8.js → cloudflare-gateway-CiIZHU0Q.js} +5 -164
- package/dist/src/{cloudflare-gateway-CP9QEWYS.js → cloudflare-gateway-DI1HNP5F.js} +4 -15
- package/dist/src/codex-sdk-BAmYE7qy.js +3 -0
- package/dist/src/codex-sdk-C2_M2pl_.cjs +1172 -0
- package/dist/src/codex-sdk-CErXn7qh.js +1165 -0
- package/dist/src/codex-sdk-CWEnH70W.cjs +2 -0
- package/dist/src/codex-sdk-CpqiOqDO.js +1164 -0
- package/dist/src/codex-sdk-Rtky3M4I.js +1165 -0
- package/dist/src/{cometapi-BL9yvj_f.js → cometapi-BUlt_ELa.js} +8 -15
- package/dist/src/{cometapi-DFNiKmSz.js → cometapi-CtJ-mS8R.js} +8 -16
- package/dist/src/cometapi-DT-jlVCB.js +55 -0
- package/dist/src/cometapi-UVOryo4W.cjs +55 -0
- package/dist/src/{completion-CM6oK8PS.cjs → completion-BozdoXba.cjs} +7 -62
- package/dist/src/{completion-5MzrpJxT.js → completion-Dnxn7E-j.js} +8 -57
- package/dist/src/{completion-qRoZAYRB.js → completion-HUe8wDhZ.js} +8 -57
- package/dist/src/{completion-DZ083F31.js → completion-x0a_c2y1.js} +8 -57
- package/dist/src/{createHash-CTQmL3G2.js → createHash-4gFQpDDv.js} +3 -3
- package/dist/src/{createHash-CfZSc0b4.cjs → createHash-B7KvgoOD.cjs} +4 -4
- package/dist/src/{createHash-Da8fMwqB.js → createHash-ChI45QR1.js} +3 -3
- package/dist/src/{createHash-DmPQkvBh.js → createHash-CwDVU5xr.js} +3 -3
- package/dist/src/{docker-ExVyLp0S.js → docker-CQmlA2NU.js} +7 -14
- package/dist/src/{docker-Bb5dcxr8.js → docker-ClnmCf1Z.js} +6 -14
- package/dist/src/{docker-BvfL2BrW.js → docker-DCgsveLD.js} +6 -16
- package/dist/src/{docker-DcF2pRrj.cjs → docker-DS4_Osau.cjs} +7 -15
- package/dist/src/embedding-D3xTseo7.js +59 -0
- package/dist/src/embedding-DD9wa3ae.js +58 -0
- package/dist/src/embedding-I45KG3o7.cjs +63 -0
- package/dist/src/embedding-nFbumxcv.js +58 -0
- package/dist/src/entrypoint.js +69 -6
- package/dist/src/{errors-P6ll7XSJ.js → errors-Cw810C93.js} +1 -1
- package/dist/src/{esm-CaIwzWR5.js → esm-C7PnfdF8.js} +16 -7
- package/dist/src/{esm-CnNt7sI4.cjs → esm-CtEPLdAj.cjs} +15 -6
- package/dist/src/{esm-Cd1AjG1D.js → esm-Dh4dOLlt.js} +15 -6
- package/dist/src/{esm-C03C-mv3.js → esm-tVgYPY-f.js} +27 -18
- package/dist/src/eval-CzJFfFO9.js +3 -0
- package/dist/src/{eval-Dg2nG4v2.js → eval-u4UVafl6.js} +49 -20
- package/dist/src/{evalResult-BDMqrapS.js → evalResult-Bgm9ZH31.js} +7 -7
- package/dist/src/{evalResult-BBRNtX4I.js → evalResult-D3hVYFis.js} +7 -7
- package/dist/src/evalResult-D8MT9p0s.js +3 -0
- package/dist/src/evalResult-DElBuddX.js +2 -0
- package/dist/src/evalResult-Dvc-iucu.cjs +2 -0
- package/dist/src/{evalResult-fuaI8HkH.cjs → evalResult-KZqXl4XP.cjs} +7 -7
- package/dist/src/evaluator-CVessDWe.js +3 -0
- package/dist/src/{evaluator-BhoWwp5b.js → evaluator-IvuDYSvQ.js} +3080 -1254
- package/dist/src/{extractor-D25qpmGX.js → extractor-CAfTSraf.js} +6 -6
- package/dist/src/{extractor-DReVID0K.js → extractor-DNSeBVOJ.js} +6 -6
- package/dist/src/{extractor-C0EVHewb.js → extractor-Dk6bRWkv.js} +6 -6
- package/dist/src/{extractor-pYLLi3wS.cjs → extractor-WVPOrH43.cjs} +6 -6
- package/dist/src/{fetch-HaqdX7U1.js → fetch-B0Z3Oe4k.js} +218 -55
- package/dist/src/{fetch-Dxpd4_sr.js → fetch-BEWnXrrG.js} +195 -45
- package/dist/src/fetch-C7bGKDlQ.js +3 -0
- package/dist/src/{fetch-BPkYtG8K.cjs → fetch-CJU5ELPa.cjs} +223 -48
- package/dist/src/{fetch-Cwxnd8zz.js → fetch-Di00EQrc.js} +218 -55
- package/dist/src/{fileExtensions-Ds-foDzt.js → fileExtensions-AWa2ZML4.js} +1 -1
- package/dist/src/{fileExtensions-LcDYkU4v.js → fileExtensions-BArZuxsI.js} +1 -1
- package/dist/src/{formatDuration-DgBVMN65.js → formatDuration-DZzPsexs.js} +1 -1
- package/dist/src/{genaiTracer-D3fD9dNV.js → genaiTracer-COYDi-tC.js} +6 -2
- package/dist/src/{genaiTracer-C1rxGO8Q.js → genaiTracer-DWdZ28hY.js} +6 -2
- package/dist/src/{genaiTracer-70Z8BIuV.js → genaiTracer-XnrcgDCe.js} +6 -2
- package/dist/src/{genaiTracer-DN4dQywX.cjs → genaiTracer-yRuxj9-L.cjs} +7 -3
- package/dist/src/golang/wrapper.go +1 -1
- package/dist/src/{graders-DU49_J8Y.cjs → graders--zknU_uk.cjs} +5747 -3206
- package/dist/src/graders-BOAzQEUe.cjs +2 -0
- package/dist/src/graders-D4BTsZdG2.js +3 -0
- package/dist/src/graders-DOJK1XpV.js +2 -0
- package/dist/src/graders-NAv9LcBn.js +2 -0
- package/dist/src/{graders-BTeBGqjJ.js → graders-Zy3x0zqX.js} +5727 -3218
- package/dist/src/{graders-Bj_Odv7c.js → graders-eIHhRqoC.js} +5719 -3210
- package/dist/src/{graders-DP7KFFo-.js → graders-pvbReLLn.js} +5728 -3219
- package/dist/src/{image-B0h9VEMc.js → image-9302QVqR.js} +4 -4
- package/dist/src/{image-CHfWvljl.js → image-B5Mv-Z3h.js} +8 -8
- package/dist/src/{image-DS-o-0ph.js → image-DVz2RiMF.js} +8 -8
- package/dist/src/{image-C1madmKh.cjs → image-De2FBmYV.cjs} +4 -4
- package/dist/src/{image-B02ogr_b.js → image-dnoUgPrC.js} +4 -5
- package/dist/src/{image-Dpxa1Jt6.js → image-qUpPvmNZ.js} +8 -8
- package/dist/src/{image-Bb4vWQLM.js → image-u7-rKnYU.js} +4 -4
- package/dist/src/{image-BLmROtN3.cjs → image-x6KqLQl4.cjs} +8 -8
- package/dist/src/index.cjs +3728 -1482
- package/dist/src/index.d.cts +3232 -79
- package/dist/src/index.d.ts +3232 -79
- package/dist/src/index.js +3735 -1490
- package/dist/src/{interactiveCheck-BgLZUIt3.js → interactiveCheck-CLERUB0c.js} +2 -2
- package/dist/src/{knowledgeBase-DOO_BM9b.cjs → knowledgeBase-Bpoe_nLu.cjs} +6 -8
- package/dist/src/{knowledgeBase-D33Ty2l6.js → knowledgeBase-Dgc7CBWF.js} +6 -8
- package/dist/src/{knowledgeBase-B3OoKIej.js → knowledgeBase-RhFPGWDc.js} +6 -8
- package/dist/src/{knowledgeBase-CYTLHOt1.js → knowledgeBase-lm9RXSAm.js} +6 -9
- package/dist/src/{litellm-NbjknEh6.js → litellm-C2kqjxqp.js} +6 -14
- package/dist/src/{litellm-I_hbp_dc.cjs → litellm-CoyI4IAl.cjs} +6 -15
- package/dist/src/{litellm-TrljxD9G.js → litellm-DRjpcSa7.js} +5 -14
- package/dist/src/{litellm-AaeZcZQF.js → litellm-p37R1dzQ.js} +5 -16
- package/dist/src/{logger-DLcq4dWf.js → logger-B88EkIn6.js} +48 -23
- package/dist/src/{logger-Cp1GPUjj.cjs → logger-COuQb2xB.cjs} +77 -22
- package/dist/src/{logger-CT3IKMKA.js → logger-Ct2S6Yx-.js} +48 -23
- package/dist/src/{logger-KkObSCzq.js → logger-DksKw1Qc.js} +48 -23
- package/dist/src/{luma-ray-f6I2fft-.js → luma-ray-B863CmuZ.js} +6 -10
- package/dist/src/{luma-ray-DDsjcgZZ.js → luma-ray-BTTLtqQ8.js} +7 -10
- package/dist/src/{luma-ray-Due0n7di.cjs → luma-ray-BxVKaW2a.cjs} +6 -10
- package/dist/src/{luma-ray-BS2_tY8L.js → luma-ray-KgTCXrZC.js} +6 -12
- package/dist/src/main.d.ts +1 -26
- package/dist/src/main.js +1011 -548
- package/dist/src/{messages-Bs1kC7P4.cjs → messages-811uVVW5.cjs} +74 -19
- package/dist/src/{messages-BS17jdMx.js → messages-BTQz42fn.js} +74 -19
- package/dist/src/{messages-ZJk778GH.js → messages-MYTQ2TWp.js} +74 -19
- package/dist/src/{messages-D0lx5qK7.js → messages-zWbkLLHz.js} +74 -19
- package/dist/src/{meteor-D-SotUw9.js → meteor-CU5UAE-H.js} +1 -1
- package/dist/src/{meteor-DLZZ3osF.cjs → meteor-Co1VQ1u5.cjs} +1 -1
- package/dist/src/{meteor-44VjEACX.js → meteor-DHdzY1Ss.js} +1 -1
- package/dist/src/{meteor-DUiCJRC-.js → meteor-DuAFv6gF.js} +1 -1
- package/dist/src/{modelslab-Bmni6skY.js → modelslab-D0erNWKe.js} +7 -10
- package/dist/src/{modelslab-DRb74SP4.js → modelslab-DIq-6y7x.js} +7 -10
- package/dist/src/{modelslab-CoUX6Jc_.cjs → modelslab-Dk1JAtVo.cjs} +7 -10
- package/dist/src/{modelslab-Bx9IrZfS.js → modelslab-wu9yi5GE.js} +7 -11
- package/dist/src/{nova-reel-BfPq-0Yk.js → nova-reel-CCFRfeRb.js} +7 -10
- package/dist/src/{nova-reel-C_QM18Xn.cjs → nova-reel-CrLXVKQf.cjs} +6 -10
- package/dist/src/{nova-reel-bgjxilYW.js → nova-reel-DQrm74ng.js} +6 -10
- package/dist/src/{nova-reel-D_W1tjMH.js → nova-reel-gr11WG7f.js} +6 -12
- package/dist/src/{nova-sonic-DIGQNR07.js → nova-sonic-BYdp-QLs.js} +5 -7
- package/dist/src/{nova-sonic-CFb5GYhg.js → nova-sonic-B_ZXcUJB.js} +4 -7
- package/dist/src/{nova-sonic-De1HW5fD.js → nova-sonic-TDgrlTk7.js} +4 -9
- package/dist/src/{nova-sonic-zfcljeRp.cjs → nova-sonic-i5tUvXKn.cjs} +4 -7
- package/dist/src/{openai-DElQ-fPX.js → openai-DhVEmgeZ.js} +6 -3
- package/dist/src/{openai-DhbB7eWK.js → openai-Qsvz25mV.js} +6 -3
- package/dist/src/{openai-Cuif0GEt.cjs → openai-URNyItar.cjs} +6 -3
- package/dist/src/{openai-j-sE2O7r.js → openai-iYtrXzOX.js} +6 -3
- package/dist/src/openclaw-CLWrW03k.js +1200 -0
- package/dist/src/openclaw-CnQ363Wi.js +1199 -0
- package/dist/src/openclaw-CwzlQSQX.js +1199 -0
- package/dist/src/openclaw-wX9rtfke.cjs +1205 -0
- package/dist/src/{opencode-sdk-B3CWY9h_.js → opencode-sdk-BUu5Nevv.js} +12 -14
- package/dist/src/{opencode-sdk-BL764Jdi.cjs → opencode-sdk-BZ2idgYA.cjs} +16 -18
- package/dist/src/{opencode-sdk-0j6rTWNb.js → opencode-sdk-BxD8vXp_.js} +12 -15
- package/dist/src/{opencode-sdk-C2y6UkP2.js → opencode-sdk-GI2KaAXq.js} +12 -14
- package/dist/src/{otlpReceiver-C99PPb48.js → otlpReceiver-B2z58l4e.js} +154 -98
- package/dist/src/{otlpReceiver-CGq6LspY.cjs → otlpReceiver-BfcVq2Nq.cjs} +154 -98
- package/dist/src/{otlpReceiver-D89fR-rC.js → otlpReceiver-BntK801g.js} +154 -98
- package/dist/src/{otlpReceiver-CdNBdbsk.js → otlpReceiver-DmVulbhC.js} +154 -98
- package/dist/src/{providerRegistry-CD8MEar9.js → providerRegistry-Bvh8mv85.js} +2 -2
- package/dist/src/{providerRegistry-DM8rZYol.js → providerRegistry-CPQ_CmVO.js} +2 -2
- package/dist/src/{providerRegistry-Civky8Ar.cjs → providerRegistry-CQMdTmHP.cjs} +2 -2
- package/dist/src/{providerRegistry-B0RUOLI_.js → providerRegistry-CWoPjKFZ.js} +2 -2
- package/dist/src/{providers-CgKOSgTR.cjs → providers-1eKkXBKp.cjs} +1435 -930
- package/dist/src/{providers-BlqUifFg.js → providers-BV_KMZje.js} +1419 -944
- package/dist/src/providers-Bp4S-FvO.js +2 -0
- package/dist/src/providers-DV3ax9e_.cjs +3 -0
- package/dist/src/{providers-D8lF1sqW.js → providers-Domz_llv.js} +1427 -952
- package/dist/src/{providers-Dk_6ocUX.js → providers-DruaQfwu.js} +1424 -949
- package/dist/src/providers-iUt5fbAN.js +3 -0
- package/dist/src/providers-u9Enmfok.js +2 -0
- package/dist/src/python/persistent_wrapper.py +0 -5
- package/dist/src/{pythonUtils-D6fwaDSg.js → pythonUtils-C2UQ30Rz.js} +4 -4
- package/dist/src/{pythonUtils-D5nxkQ0P.js → pythonUtils-Cldx7huE.js} +4 -4
- package/dist/src/{pythonUtils-C3py6GC1.js → pythonUtils-CnndUbW-.js} +3 -3
- package/dist/src/{pythonUtils-CTU3Y3lw.cjs → pythonUtils-tAJvvpS-.cjs} +3 -3
- package/dist/src/{quiverai-CIaELU_m.js → quiverai-CtWi6x_g.js} +4 -4
- package/dist/src/{quiverai-PdShCPox.cjs → quiverai-DFotyafY.cjs} +4 -4
- package/dist/src/{quiverai-BbOUOn2L.js → quiverai-DR0SnIQV.js} +4 -4
- package/dist/src/{quiverai-uH-dcTIr.js → quiverai-aPPvXOgn.js} +4 -5
- package/dist/src/render-CH-62LbA.js +135 -0
- package/dist/src/render-CMEpfLaO.js +136 -0
- package/dist/src/{render-Drod8m7K.js → render-CgVDrJmM.js} +2 -3
- package/dist/src/render-DHIZ6_k8.js +135 -0
- package/dist/src/render-DfQSFxGE.cjs +165 -0
- package/dist/src/{responses-DIR9Ud3j.js → responses--OsX2aYW.js} +23 -14
- package/dist/src/{responses-D8SBTL64.cjs → responses-Bi9vBuW_.cjs} +24 -15
- package/dist/src/{responses-CB2jwoAr.js → responses-C-flexAY.js} +24 -15
- package/dist/src/{responses-WNGNYe3K.js → responses-DL9m8CyY.js} +24 -15
- package/dist/src/{rubyUtils-DhCAlxZr.cjs → rubyUtils-B6eljPuh.cjs} +3 -3
- package/dist/src/{rubyUtils-BcuGX77l.js → rubyUtils-CYSQEG4a.js} +3 -3
- package/dist/src/rubyUtils-D1L2d3jb.js +3 -0
- package/dist/src/rubyUtils-DUbq4tff.cjs +2 -0
- package/dist/src/{rubyUtils-BUVePouc.js → rubyUtils-DVLeA2jg.js} +3 -3
- package/dist/src/{rubyUtils-Boc4HZzX.js → rubyUtils-DsGrTx8R.js} +3 -3
- package/dist/src/{sagemaker-CNBxx5CJ.js → sagemaker-BVkaG2-l.js} +14 -18
- package/dist/src/{sagemaker-CemTFp2h.js → sagemaker-BveBvuxm.js} +14 -18
- package/dist/src/{sagemaker-YSyBXQQh.js → sagemaker-D67yzMzs.js} +14 -19
- package/dist/src/{sagemaker-Cl28mZU2.cjs → sagemaker-XnfhheQv.cjs} +14 -18
- package/dist/src/{scanner-BsBlNXNn.js → scanner-1DqWi1Ej.js} +130 -35
- package/dist/src/server/golang/wrapper.go +1 -1
- package/dist/src/server/index.js +3757 -1511
- package/dist/src/server/python/persistent_wrapper.py +0 -5
- package/dist/src/{server-CqzrVGpF.js → server-BNYztJkh.js} +128 -9
- package/dist/src/{server-CuxBbeSY.js → server-BSB45Nt9.js} +127 -8
- package/dist/src/{server-VWgWb00X.js → server-D6Il2Sob.js} +126 -7
- package/dist/src/server-DCtHUqlp.js +3 -0
- package/dist/src/server-DaA2eR26.cjs +2 -0
- package/dist/src/{server-C_7Ax-hA.cjs → server-Dx2TyCH2.cjs} +140 -6
- package/dist/src/{signal-4U3mfRvL.js → signal-CE5G3a7x.js} +3 -3
- package/dist/src/{slack-BmVAVGaK.cjs → slack-1Rhq0EoV.cjs} +2 -2
- package/dist/src/{slack-DCUPTzS2.js → slack-D5Wpy8LM.js} +2 -2
- package/dist/src/{slack-DXMKtA-f.js → slack-DDUe-5MC.js} +2 -2
- package/dist/src/{slack-DOdy_kyv.js → slack-acRb0IqQ.js} +2 -2
- package/dist/src/store-CWOSz6D_.cjs +2 -0
- package/dist/src/{store-Dim__MDd.js → store-CYEy5J2D.js} +17 -5
- package/dist/src/{store-DLlFCC4h.cjs → store-DAAyxcy6.cjs} +17 -5
- package/dist/src/store-DCDBhv7B.js +3 -0
- package/dist/src/{store-CXGFv4aR.js → store-Dn9HUkdW.js} +17 -5
- package/dist/src/{store-DXilxTl-.js → store-M0b1WfYb.js} +17 -5
- package/dist/src/{tables-gftXzE9I.js → tables-C4CH3zRr.js} +3 -3
- package/dist/src/{tables-DLJPUdUE.js → tables-CsWou1Bx.js} +3 -3
- package/dist/src/{tables-6YKwjN9-.js → tables-DQ4WU5tX.js} +3 -3
- package/dist/src/{tables-DPi7wKeM.cjs → tables-DUfh1F7Z.cjs} +3 -3
- package/dist/src/telemetry-C1IqxcdW.js +3 -0
- package/dist/src/telemetry-C4ZEa_es.cjs +2 -0
- package/dist/src/{telemetry-CMrFgtPB.js → telemetry-CQPez_Jp.js} +4 -4
- package/dist/src/{telemetry-DaX14Chu.cjs → telemetry-Dsw_faFj.cjs} +4 -4
- package/dist/src/{telemetry-Dthj_BbD.js → telemetry-Dvqxv3YC.js} +4 -4
- package/dist/src/{telemetry-Cps3mIU-.js → telemetry-dbaJ0E98.js} +4 -4
- package/dist/src/{text-CW1cyrwj.cjs → text-BVi-cLPJ.cjs} +1 -1
- package/dist/src/{text-B_UCRPp2.js → text-CZr46tp_.js} +1 -1
- package/dist/src/{text-TIv0QYnd.js → text-DHxdyQqT.js} +1 -1
- package/dist/src/{text-Db-Wt2u2.js → text-KvuD2Iko.js} +1 -1
- package/dist/src/{tokenUsageUtils-bVa1ga6f.cjs → tokenUsageUtils-Bb7DkZPz.cjs} +7 -3
- package/dist/src/{tokenUsageUtils-NYT-WKS6.js → tokenUsageUtils-C-bmyHoE.js} +7 -3
- package/dist/src/{tokenUsageUtils-DflFMjS0.js → tokenUsageUtils-CXrvO-wA.js} +7 -3
- package/dist/src/{transcription-NLVG9MT1.cjs → transcription-BvjmiYB1.cjs} +12 -16
- package/dist/src/{transcription-BNYURcXg.js → transcription-CJspiD2c.js} +11 -14
- package/dist/src/{transcription-B_OdaHp7.js → transcription-DuWDupG7.js} +10 -14
- package/dist/src/{transcription-s6A-bNrZ.js → transcription-V2HaAmy2.js} +10 -16
- package/dist/src/{transform-DECvGmzp.js → transform-Bbg6A8Jk.js} +4 -4
- package/dist/src/{transform-vNucnNr0.js → transform-CG0ehZNG.js} +11 -7
- package/dist/src/{transform-DuHvhZpj.cjs → transform-CTeuTR3S.cjs} +31 -9
- package/dist/src/{transform-CzK1Q0zl.cjs → transform-CUnzlsbn.cjs} +4 -4
- package/dist/src/{transform-aa6tmVpZ.js → transform-DYX1_Xnh.js} +5 -5
- package/dist/src/transform-DgKlRr73.cjs +2 -0
- package/dist/src/transform-M6ITAESf.js +3 -0
- package/dist/src/{transform-DilY9wbS.js → transform-UN5UGu8U.js} +5 -5
- package/dist/src/{transform-uAytVuyX.js → transform-lQrDE1BQ.js} +11 -7
- package/dist/src/{transform-D5HsjduX.js → transform-zDhMmzwX.js} +11 -7
- package/dist/src/{transformersAvailability-CEVM2GNQ.js → transformersAvailability-CcHusyhw.js} +1 -1
- package/dist/src/{transformersAvailability-CwayUSlh.cjs → transformersAvailability-Cju9mHgR.cjs} +1 -1
- package/dist/src/{transformersAvailability-D6c6ROpT.js → transformersAvailability-DLlROWhg.js} +1 -1
- package/dist/src/{types-DmyIJ-sR.js → types-BGQDAP8i.js} +357 -22
- package/dist/src/{types-CzW2QFyi.js → types-Bgh5SOn6.js} +358 -24
- package/dist/src/{types-C_7nyzr1.cjs → types-CeaeaZdP.cjs} +393 -22
- package/dist/src/{types-Cbd8uOMq.js → types-Dm9JM6Vb.js} +368 -23
- package/dist/src/{util-BHGHw5G1.js → util-BYvQUPp7.js} +138 -36
- package/dist/src/{util-B9vlHIIh.cjs → util-Bxn8emtE.cjs} +15 -168
- package/dist/src/{util-ZzmqNPlg.js → util-C8e5uydV.js} +19 -142
- package/dist/src/{util-CMy69ZgQ.js → util-C9J8ahRn.js} +18 -4
- package/dist/src/{util-BzMcevZc.cjs → util-CN3SrLT4.cjs} +18 -4
- package/dist/src/{util-BV4XUC0n.js → util-D3q0WQ-0.js} +18 -4
- package/dist/src/{util-Dnmk2mBQ.js → util-D9TisOyk.js} +18 -4
- package/dist/src/{util-B3xGByQh.js → util-DDs-7g6-.js} +138 -36
- package/dist/src/{util-Bv6uGDfH.js → util-DvU2Pw8c.js} +138 -36
- package/dist/src/{util-C1CeHl-P.js → util-DxWpWjhc.js} +13 -136
- package/dist/src/{util-BRYkYPTd.js → util-oGMLA7vc.js} +17 -140
- package/dist/src/{util-DGNOS1db.cjs → util-olYL5C6N.cjs} +143 -35
- package/dist/src/{utils-Cz9qXqII.cjs → utils-B05gLxER.cjs} +6 -4
- package/dist/src/{utils-f2-Moju7.js → utils-BLJKfv0y.js} +6 -4
- package/dist/src/{utils-dLokC-eR.js → utils-DJfvjyMj.js} +6 -4
- package/dist/src/{utils-XiOAgly5.js → utils-hXtCYanr.js} +6 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +66 -57
- package/dist/src/app/assets/index-4LKxG2CG.js +0 -439
- package/dist/src/app/assets/index-C3zcsZFQ.css +0 -1
- package/dist/src/app/assets/scroll-timeline-BdJZVXlz.js +0 -1
- package/dist/src/app/assets/sync-9qqYcY-B.js +0 -4
- package/dist/src/app/assets/vendor-charts-BnDWwBlI.js +0 -36
- package/dist/src/app/assets/vendor-markdown-0tekx3KX.js +0 -29
- package/dist/src/app/assets/vendor-react-AtKqiNEf.js +0 -4
- package/dist/src/app/assets/vendor-syntax-D06x6TQF.js +0 -2
- package/dist/src/app/assets/vendor-utils-BvMHZmO7.js +0 -37
- package/dist/src/app/tsconfig.app.tsbuildinfo +0 -1
- package/dist/src/cache-BVeDlD87.js +0 -726
- package/dist/src/cache-C4Nxf52C.js +0 -756
- package/dist/src/cache-CeUpFm3M.cjs +0 -5
- package/dist/src/cache-Dh5WtQps.cjs +0 -816
- package/dist/src/cache-i1P6crbO.js +0 -756
- package/dist/src/cache-n-RCJ-hL.js +0 -6
- package/dist/src/cloud-BBh91EUK.js +0 -4
- package/dist/src/codex-sdk-C6UMlxwV.js +0 -665
- package/dist/src/codex-sdk-DUwKWezN.js +0 -665
- package/dist/src/codex-sdk-GGAw0qbD.js +0 -666
- package/dist/src/codex-sdk-fAO0c3yA.cjs +0 -669
- package/dist/src/eval-B3r2CVXr.js +0 -15
- package/dist/src/evalResult-5xwYnECe.js +0 -12
- package/dist/src/evalResult-71lY93Kj.cjs +0 -10
- package/dist/src/evalResult-Dx5P5cIv.js +0 -10
- package/dist/src/evaluator-Jx6bRZV6.js +0 -36
- package/dist/src/fetch-BxNb_Lp3.js +0 -5
- package/dist/src/graders-B_pgMLS2.js +0 -34
- package/dist/src/graders-DErokPDO.cjs +0 -32
- package/dist/src/graders-DR_uNe54.js +0 -32
- package/dist/src/graders-w3176Wz-.js +0 -32
- package/dist/src/openclaw-CSugPYAr.cjs +0 -586
- package/dist/src/openclaw-DiSz3I5L.js +0 -582
- package/dist/src/openclaw-DuvJKEW5.js +0 -580
- package/dist/src/openclaw-tiVYRtr-.js +0 -580
- package/dist/src/providers-B7V0njNs.js +0 -32
- package/dist/src/providers-BEwbhv0X.js +0 -30
- package/dist/src/providers-CH3C7zf7.js +0 -30
- package/dist/src/providers-zyB6k_38.cjs +0 -31
- package/dist/src/rubyUtils-BUHu6PhO.js +0 -5
- package/dist/src/rubyUtils-CP42kMvq.cjs +0 -4
- package/dist/src/server-DA4Cyrrq.js +0 -7
- package/dist/src/server-Dulb-4-K.cjs +0 -5
- package/dist/src/store-CXS-Q_91.js +0 -6
- package/dist/src/store-eYkaKMwq.cjs +0 -5
- package/dist/src/telemetry-BpMfhthR.cjs +0 -5
- package/dist/src/telemetry-Dw38hanS.js +0 -7
- package/dist/src/tokenUsageUtils-BDGe-iyI.js +0 -138
- package/dist/src/transform-DTGDnAzW.js +0 -6
- package/dist/src/transform-m3qNw4KP.cjs +0 -5
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
const require_logger = require("./logger-
|
|
2
|
-
const require_esm = require("./esm-
|
|
3
|
-
require("./
|
|
4
|
-
require("./tables-DPi7wKeM.cjs");
|
|
5
|
-
const require_store = require("./store-DLlFCC4h.cjs");
|
|
1
|
+
const require_logger = require("./logger-COuQb2xB.cjs");
|
|
2
|
+
const require_esm = require("./esm-CtEPLdAj.cjs");
|
|
3
|
+
const require_store = require("./store-DAAyxcy6.cjs");
|
|
6
4
|
let path = require("path");
|
|
7
5
|
path = require_logger.__toESM(path);
|
|
8
6
|
let express = require("express");
|
|
@@ -95,28 +93,57 @@ const SPAN_KIND_MAP = {
|
|
|
95
93
|
4: "producer",
|
|
96
94
|
5: "consumer"
|
|
97
95
|
};
|
|
96
|
+
const DEFAULT_ACCEPT_FORMATS = ["json", "protobuf"];
|
|
97
|
+
const OTLP_CONTENT_TYPES = {
|
|
98
|
+
json: "application/json",
|
|
99
|
+
protobuf: "application/x-protobuf"
|
|
100
|
+
};
|
|
101
|
+
function normalizeAcceptFormats(acceptFormats) {
|
|
102
|
+
const normalized = [...new Set(acceptFormats ?? DEFAULT_ACCEPT_FORMATS)];
|
|
103
|
+
return normalized.length > 0 ? normalized : [...DEFAULT_ACCEPT_FORMATS];
|
|
104
|
+
}
|
|
105
|
+
function getRequestFormat(contentType) {
|
|
106
|
+
const mimeType = (Array.isArray(contentType) ? contentType[0] : contentType)?.split(";", 1)[0]?.trim().toLowerCase();
|
|
107
|
+
if (mimeType === OTLP_CONTENT_TYPES.json) return "json";
|
|
108
|
+
if (mimeType === OTLP_CONTENT_TYPES.protobuf) return "protobuf";
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
98
111
|
var OTLPReceiver = class {
|
|
99
112
|
app;
|
|
113
|
+
acceptFormats;
|
|
100
114
|
traceStore;
|
|
101
115
|
port;
|
|
102
116
|
server;
|
|
103
|
-
constructor() {
|
|
117
|
+
constructor(options = {}) {
|
|
104
118
|
this.app = (0, express.default)();
|
|
119
|
+
this.acceptFormats = normalizeAcceptFormats(options.acceptFormats);
|
|
105
120
|
this.traceStore = require_store.getTraceStore();
|
|
106
121
|
require_logger.logger.debug("[OtlpReceiver] Initializing OTLP receiver");
|
|
107
122
|
this.setupMiddleware();
|
|
108
123
|
this.setupRoutes();
|
|
109
124
|
}
|
|
110
125
|
setupMiddleware() {
|
|
111
|
-
this.app.use(
|
|
126
|
+
this.app.use("/v1/traces", (req, res, next) => {
|
|
127
|
+
if (req.method !== "POST") {
|
|
128
|
+
next();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const format = getRequestFormat(req.headers["content-type"]);
|
|
132
|
+
if (!format || !this.acceptFormats.includes(format)) {
|
|
133
|
+
res.status(415).json({ error: "Unsupported content type" });
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
next();
|
|
137
|
+
});
|
|
138
|
+
this.app.use("/v1/traces", express.default.json({
|
|
112
139
|
limit: "10mb",
|
|
113
|
-
type: "
|
|
140
|
+
type: (req) => this.acceptFormats.includes("json") && getRequestFormat(req.headers["content-type"]) === "json"
|
|
114
141
|
}));
|
|
115
|
-
this.app.use(express.default.raw({
|
|
116
|
-
|
|
117
|
-
|
|
142
|
+
this.app.use("/v1/traces", express.default.raw({
|
|
143
|
+
limit: "10mb",
|
|
144
|
+
type: (req) => this.acceptFormats.includes("protobuf") && getRequestFormat(req.headers["content-type"]) === "protobuf"
|
|
118
145
|
}));
|
|
119
|
-
require_logger.logger.debug("[OtlpReceiver] Middleware configured for
|
|
146
|
+
require_logger.logger.debug("[OtlpReceiver] Middleware configured for accepted OTLP formats");
|
|
120
147
|
}
|
|
121
148
|
setupRoutes() {
|
|
122
149
|
this.app.post("/v1/traces", async (req, res) => {
|
|
@@ -124,64 +151,19 @@ var OTLPReceiver = class {
|
|
|
124
151
|
const bodySize = req.body ? JSON.stringify(req.body).length : 0;
|
|
125
152
|
require_logger.logger.debug(`[OtlpReceiver] Received trace request: ${req.headers["content-type"]} with ${bodySize} bytes`);
|
|
126
153
|
require_logger.logger.debug("[OtlpReceiver] Starting to process traces");
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
if (!isJson && !isProtobuf) {
|
|
154
|
+
const format = getRequestFormat(contentType);
|
|
155
|
+
if (!format || !this.acceptFormats.includes(format)) {
|
|
130
156
|
res.status(415).json({ error: "Unsupported content type" });
|
|
131
157
|
return;
|
|
132
158
|
}
|
|
133
159
|
try {
|
|
134
|
-
|
|
135
|
-
if (isJson) {
|
|
136
|
-
require_logger.logger.debug("[OtlpReceiver] Parsing OTLP JSON request");
|
|
137
|
-
require_logger.logger.debug(`[OtlpReceiver] Request body: ${JSON.stringify(req.body).substring(0, 500)}...`);
|
|
138
|
-
traces = this.parseOTLPJSONRequest(req.body);
|
|
139
|
-
} else if (isProtobuf) {
|
|
140
|
-
require_logger.logger.debug("[OtlpReceiver] Parsing OTLP protobuf request");
|
|
141
|
-
require_logger.logger.debug(`[OtlpReceiver] Request body size: ${req.body?.length || 0} bytes`);
|
|
142
|
-
traces = await this.parseOTLPProtobufRequest(req.body);
|
|
143
|
-
}
|
|
160
|
+
const traces = await this.parseIncomingRequest(format, req.body);
|
|
144
161
|
require_logger.logger.debug(`[OtlpReceiver] Parsed ${traces.length} traces from request`);
|
|
145
|
-
|
|
146
|
-
const traceInfoById = /* @__PURE__ */ new Map();
|
|
147
|
-
for (const trace of traces) {
|
|
148
|
-
if (!spansByTrace.has(trace.traceId)) {
|
|
149
|
-
spansByTrace.set(trace.traceId, []);
|
|
150
|
-
const evaluationId = trace.span.attributes?.["evaluation.id"];
|
|
151
|
-
const testCaseId = trace.span.attributes?.["test.case.id"];
|
|
152
|
-
const info = traceInfoById.get(trace.traceId) ?? {};
|
|
153
|
-
if (evaluationId) info.evaluationId = evaluationId;
|
|
154
|
-
if (testCaseId) info.testCaseId = testCaseId;
|
|
155
|
-
traceInfoById.set(trace.traceId, info);
|
|
156
|
-
}
|
|
157
|
-
spansByTrace.get(trace.traceId).push(trace.span);
|
|
158
|
-
}
|
|
159
|
-
require_logger.logger.debug(`[OtlpReceiver] Grouped spans into ${spansByTrace.size} traces`);
|
|
160
|
-
for (const [traceId, info] of traceInfoById) try {
|
|
161
|
-
require_logger.logger.debug(`[OtlpReceiver] Creating trace record for ${traceId}`);
|
|
162
|
-
await this.traceStore.createTrace({
|
|
163
|
-
traceId,
|
|
164
|
-
evaluationId: info.evaluationId || "",
|
|
165
|
-
testCaseId: info.testCaseId || ""
|
|
166
|
-
});
|
|
167
|
-
} catch (error) {
|
|
168
|
-
require_logger.logger.debug(`[OtlpReceiver] Trace ${traceId} may already exist: ${error}`);
|
|
169
|
-
}
|
|
170
|
-
for (const [traceId, spans] of spansByTrace) {
|
|
171
|
-
require_logger.logger.debug(`[OtlpReceiver] Storing ${spans.length} spans for trace ${traceId}`);
|
|
172
|
-
await this.traceStore.addSpans(traceId, spans, { skipTraceCheck: true });
|
|
173
|
-
}
|
|
162
|
+
await this.persistTraces(this.groupTraces(traces));
|
|
174
163
|
res.status(200).json({ partialSuccess: {} });
|
|
175
164
|
require_logger.logger.debug("[OtlpReceiver] Successfully processed traces");
|
|
176
165
|
} catch (error) {
|
|
177
|
-
|
|
178
|
-
require_logger.logger.error(`[OtlpReceiver] Error stack: ${error instanceof Error ? error.stack : "No stack"}`);
|
|
179
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
180
|
-
if (errorMessage.toLowerCase().includes("invalid protobuf")) {
|
|
181
|
-
res.status(400).json({ error: errorMessage });
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
res.status(500).json({ error: "Internal server error" });
|
|
166
|
+
this.handleProcessingError(error, res);
|
|
185
167
|
}
|
|
186
168
|
});
|
|
187
169
|
this.app.get("/health", (_req, res) => {
|
|
@@ -192,7 +174,7 @@ var OTLPReceiver = class {
|
|
|
192
174
|
res.status(200).json({
|
|
193
175
|
service: "promptfoo-otlp-receiver",
|
|
194
176
|
version: "1.0.0",
|
|
195
|
-
supported_formats:
|
|
177
|
+
supported_formats: this.acceptFormats
|
|
196
178
|
});
|
|
197
179
|
});
|
|
198
180
|
this.app.get("/debug/status", async (_req, res) => {
|
|
@@ -213,6 +195,71 @@ var OTLPReceiver = class {
|
|
|
213
195
|
res.status(500).json({ error: "Internal server error" });
|
|
214
196
|
});
|
|
215
197
|
}
|
|
198
|
+
async parseIncomingRequest(format, body) {
|
|
199
|
+
if (format === "json") {
|
|
200
|
+
require_logger.logger.debug("[OtlpReceiver] Parsing OTLP JSON request");
|
|
201
|
+
require_logger.logger.debug(`[OtlpReceiver] Request body: ${JSON.stringify(body).substring(0, 500)}...`);
|
|
202
|
+
return this.parseOTLPJSONRequest(body);
|
|
203
|
+
}
|
|
204
|
+
require_logger.logger.debug("[OtlpReceiver] Parsing OTLP protobuf request");
|
|
205
|
+
require_logger.logger.debug(`[OtlpReceiver] Request body size: ${body?.length || 0} bytes`);
|
|
206
|
+
return this.parseOTLPProtobufRequest(body);
|
|
207
|
+
}
|
|
208
|
+
groupTraces(traces) {
|
|
209
|
+
const spansByTrace = /* @__PURE__ */ new Map();
|
|
210
|
+
const traceInfoById = /* @__PURE__ */ new Map();
|
|
211
|
+
for (const trace of traces) {
|
|
212
|
+
const spans = spansByTrace.get(trace.traceId) ?? [];
|
|
213
|
+
spans.push(trace.span);
|
|
214
|
+
spansByTrace.set(trace.traceId, spans);
|
|
215
|
+
this.recordTraceInfo(traceInfoById, trace);
|
|
216
|
+
}
|
|
217
|
+
require_logger.logger.debug(`[OtlpReceiver] Grouped spans into ${spansByTrace.size} traces`);
|
|
218
|
+
return {
|
|
219
|
+
spansByTrace,
|
|
220
|
+
traceInfoById
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
recordTraceInfo(traceInfoById, trace) {
|
|
224
|
+
const evaluationId = trace.span.attributes?.["evaluation.id"];
|
|
225
|
+
const testCaseId = trace.span.attributes?.["test.case.id"];
|
|
226
|
+
const info = traceInfoById.get(trace.traceId) ?? {};
|
|
227
|
+
if (evaluationId) info.evaluationId = evaluationId;
|
|
228
|
+
if (testCaseId) info.testCaseId = testCaseId;
|
|
229
|
+
traceInfoById.set(trace.traceId, info);
|
|
230
|
+
}
|
|
231
|
+
async persistTraces({ spansByTrace, traceInfoById }) {
|
|
232
|
+
await this.createTraceRecords(traceInfoById);
|
|
233
|
+
await this.storeSpans(spansByTrace);
|
|
234
|
+
}
|
|
235
|
+
async createTraceRecords(traceInfoById) {
|
|
236
|
+
for (const [traceId, info] of traceInfoById) try {
|
|
237
|
+
require_logger.logger.debug(`[OtlpReceiver] Creating trace record for ${traceId}`);
|
|
238
|
+
await this.traceStore.createTrace({
|
|
239
|
+
traceId,
|
|
240
|
+
evaluationId: info.evaluationId || "",
|
|
241
|
+
testCaseId: info.testCaseId || ""
|
|
242
|
+
});
|
|
243
|
+
} catch (error) {
|
|
244
|
+
require_logger.logger.debug(`[OtlpReceiver] Trace ${traceId} may already exist: ${error}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
async storeSpans(spansByTrace) {
|
|
248
|
+
for (const [traceId, spans] of spansByTrace) {
|
|
249
|
+
require_logger.logger.debug(`[OtlpReceiver] Storing ${spans.length} spans for trace ${traceId}`);
|
|
250
|
+
await this.traceStore.addSpans(traceId, spans, { skipTraceCheck: true });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
handleProcessingError(error, res) {
|
|
254
|
+
require_logger.logger.error(`[OtlpReceiver] Failed to process OTLP traces: ${error}`);
|
|
255
|
+
require_logger.logger.error(`[OtlpReceiver] Error stack: ${error instanceof Error ? error.stack : "No stack"}`);
|
|
256
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
257
|
+
if (errorMessage.toLowerCase().includes("invalid protobuf")) {
|
|
258
|
+
res.status(400).json({ error: errorMessage });
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
res.status(500).json({ error: "Internal server error" });
|
|
262
|
+
}
|
|
216
263
|
parseOTLPJSONRequest(body) {
|
|
217
264
|
const traces = [];
|
|
218
265
|
require_logger.logger.debug(`[OtlpReceiver] Parsing request with ${body.resourceSpans?.length || 0} resource spans`);
|
|
@@ -251,44 +298,42 @@ var OTLPReceiver = class {
|
|
|
251
298
|
return traces;
|
|
252
299
|
}
|
|
253
300
|
async parseOTLPProtobufRequest(body) {
|
|
254
|
-
const traces = [];
|
|
255
301
|
const decoded = await decodeExportTraceServiceRequest(body);
|
|
256
302
|
require_logger.logger.debug(`[OtlpReceiver] Parsing protobuf request with ${decoded.resourceSpans?.length || 0} resource spans`);
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
303
|
+
return (decoded.resourceSpans || []).flatMap((resourceSpan) => this.parseDecodedResourceSpan(resourceSpan));
|
|
304
|
+
}
|
|
305
|
+
parseDecodedResourceSpan(resourceSpan) {
|
|
306
|
+
const resourceAttributes = this.parseDecodedAttributes(resourceSpan.resource?.attributes);
|
|
307
|
+
require_logger.logger.debug(`[OtlpReceiver] Parsed ${Object.keys(resourceAttributes).length} resource attributes from protobuf`);
|
|
308
|
+
return (resourceSpan.scopeSpans || []).flatMap((scopeSpan) => (scopeSpan.spans || []).map((span) => this.createDecodedParsedTrace(resourceAttributes, scopeSpan, span)));
|
|
309
|
+
}
|
|
310
|
+
createDecodedParsedTrace(resourceAttributes, scopeSpan, span) {
|
|
311
|
+
const traceId = bytesToHex(span.traceId, 32);
|
|
312
|
+
const spanId = bytesToHex(span.spanId, 16);
|
|
313
|
+
const parentSpanId = span.parentSpanId?.length ? bytesToHex(span.parentSpanId, 16) : void 0;
|
|
314
|
+
require_logger.logger.debug(`[OtlpReceiver] Processing protobuf span: ${span.name} (${spanId}) in trace ${traceId}`);
|
|
315
|
+
const spanKindCode = span.kind ?? 0;
|
|
316
|
+
const spanKindName = SPAN_KIND_MAP[spanKindCode] ?? "unspecified";
|
|
317
|
+
return {
|
|
318
|
+
traceId,
|
|
319
|
+
span: {
|
|
320
|
+
spanId,
|
|
321
|
+
parentSpanId,
|
|
322
|
+
name: span.name,
|
|
323
|
+
startTime: this.toMilliseconds(span.startTimeUnixNano) ?? 0,
|
|
324
|
+
endTime: this.toMilliseconds(span.endTimeUnixNano),
|
|
325
|
+
attributes: {
|
|
267
326
|
...resourceAttributes,
|
|
268
327
|
...this.parseDecodedAttributes(span.attributes),
|
|
269
328
|
"otel.scope.name": scopeSpan.scope?.name,
|
|
270
329
|
"otel.scope.version": scopeSpan.scope?.version,
|
|
271
330
|
"otel.span.kind": spanKindName,
|
|
272
|
-
"otel.span.kind_code":
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
traces.push({
|
|
277
|
-
traceId,
|
|
278
|
-
span: {
|
|
279
|
-
spanId,
|
|
280
|
-
parentSpanId,
|
|
281
|
-
name: span.name,
|
|
282
|
-
startTime: startTimeNano / 1e6,
|
|
283
|
-
endTime: endTimeNano ? endTimeNano / 1e6 : void 0,
|
|
284
|
-
attributes,
|
|
285
|
-
statusCode: span.status?.code,
|
|
286
|
-
statusMessage: span.status?.message
|
|
287
|
-
}
|
|
288
|
-
});
|
|
331
|
+
"otel.span.kind_code": spanKindCode
|
|
332
|
+
},
|
|
333
|
+
statusCode: span.status?.code,
|
|
334
|
+
statusMessage: span.status?.message
|
|
289
335
|
}
|
|
290
|
-
}
|
|
291
|
-
return traces;
|
|
336
|
+
};
|
|
292
337
|
}
|
|
293
338
|
parseDecodedAttributes(attributes) {
|
|
294
339
|
if (!attributes) return {};
|
|
@@ -389,15 +434,26 @@ var OTLPReceiver = class {
|
|
|
389
434
|
getApp() {
|
|
390
435
|
return this.app;
|
|
391
436
|
}
|
|
437
|
+
setAcceptFormats(acceptFormats) {
|
|
438
|
+
this.acceptFormats = normalizeAcceptFormats(acceptFormats);
|
|
439
|
+
}
|
|
440
|
+
toMilliseconds(value) {
|
|
441
|
+
if (value === void 0) return;
|
|
442
|
+
return Number(value) / 1e6;
|
|
443
|
+
}
|
|
392
444
|
};
|
|
393
445
|
let otlpReceiver = null;
|
|
394
|
-
function getOTLPReceiver() {
|
|
395
|
-
if (
|
|
446
|
+
function getOTLPReceiver(options) {
|
|
447
|
+
if (otlpReceiver) {
|
|
448
|
+
otlpReceiver.setAcceptFormats(options?.acceptFormats);
|
|
449
|
+
return otlpReceiver;
|
|
450
|
+
}
|
|
451
|
+
otlpReceiver = new OTLPReceiver(options);
|
|
396
452
|
return otlpReceiver;
|
|
397
453
|
}
|
|
398
|
-
async function startOTLPReceiver(port, host) {
|
|
454
|
+
async function startOTLPReceiver(port, host, acceptFormats) {
|
|
399
455
|
require_logger.logger.debug("[OtlpReceiver] Starting receiver through startOTLPReceiver function");
|
|
400
|
-
await getOTLPReceiver().listen(port, host);
|
|
456
|
+
await getOTLPReceiver({ acceptFormats }).listen(port, host);
|
|
401
457
|
}
|
|
402
458
|
async function stopOTLPReceiver() {
|
|
403
459
|
require_logger.logger.debug("[OtlpReceiver] Stopping receiver through stopOTLPReceiver function");
|
|
@@ -410,4 +466,4 @@ async function stopOTLPReceiver() {
|
|
|
410
466
|
exports.startOTLPReceiver = startOTLPReceiver;
|
|
411
467
|
exports.stopOTLPReceiver = stopOTLPReceiver;
|
|
412
468
|
|
|
413
|
-
//# sourceMappingURL=otlpReceiver-
|
|
469
|
+
//# sourceMappingURL=otlpReceiver-BfcVq2Nq.cjs.map
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import "./
|
|
4
|
-
import {
|
|
5
|
-
import "./tables-gftXzE9I.js";
|
|
6
|
-
import { n as getTraceStore } from "./store-Dim__MDd.js";
|
|
2
|
+
import { s as logger } from "./logger-DksKw1Qc.js";
|
|
3
|
+
import { t as getDirectory } from "./esm-tVgYPY-f.js";
|
|
4
|
+
import { n as getTraceStore } from "./store-CYEy5J2D.js";
|
|
7
5
|
import path from "path";
|
|
8
6
|
import express from "express";
|
|
9
7
|
import protobuf from "protobufjs";
|
|
@@ -93,28 +91,57 @@ const SPAN_KIND_MAP = {
|
|
|
93
91
|
4: "producer",
|
|
94
92
|
5: "consumer"
|
|
95
93
|
};
|
|
94
|
+
const DEFAULT_ACCEPT_FORMATS = ["json", "protobuf"];
|
|
95
|
+
const OTLP_CONTENT_TYPES = {
|
|
96
|
+
json: "application/json",
|
|
97
|
+
protobuf: "application/x-protobuf"
|
|
98
|
+
};
|
|
99
|
+
function normalizeAcceptFormats(acceptFormats) {
|
|
100
|
+
const normalized = [...new Set(acceptFormats ?? DEFAULT_ACCEPT_FORMATS)];
|
|
101
|
+
return normalized.length > 0 ? normalized : [...DEFAULT_ACCEPT_FORMATS];
|
|
102
|
+
}
|
|
103
|
+
function getRequestFormat(contentType) {
|
|
104
|
+
const mimeType = (Array.isArray(contentType) ? contentType[0] : contentType)?.split(";", 1)[0]?.trim().toLowerCase();
|
|
105
|
+
if (mimeType === OTLP_CONTENT_TYPES.json) return "json";
|
|
106
|
+
if (mimeType === OTLP_CONTENT_TYPES.protobuf) return "protobuf";
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
96
109
|
var OTLPReceiver = class {
|
|
97
110
|
app;
|
|
111
|
+
acceptFormats;
|
|
98
112
|
traceStore;
|
|
99
113
|
port;
|
|
100
114
|
server;
|
|
101
|
-
constructor() {
|
|
115
|
+
constructor(options = {}) {
|
|
102
116
|
this.app = express();
|
|
117
|
+
this.acceptFormats = normalizeAcceptFormats(options.acceptFormats);
|
|
103
118
|
this.traceStore = getTraceStore();
|
|
104
119
|
logger.debug("[OtlpReceiver] Initializing OTLP receiver");
|
|
105
120
|
this.setupMiddleware();
|
|
106
121
|
this.setupRoutes();
|
|
107
122
|
}
|
|
108
123
|
setupMiddleware() {
|
|
109
|
-
this.app.use(
|
|
124
|
+
this.app.use("/v1/traces", (req, res, next) => {
|
|
125
|
+
if (req.method !== "POST") {
|
|
126
|
+
next();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const format = getRequestFormat(req.headers["content-type"]);
|
|
130
|
+
if (!format || !this.acceptFormats.includes(format)) {
|
|
131
|
+
res.status(415).json({ error: "Unsupported content type" });
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
next();
|
|
135
|
+
});
|
|
136
|
+
this.app.use("/v1/traces", express.json({
|
|
110
137
|
limit: "10mb",
|
|
111
|
-
type: "
|
|
138
|
+
type: (req) => this.acceptFormats.includes("json") && getRequestFormat(req.headers["content-type"]) === "json"
|
|
112
139
|
}));
|
|
113
|
-
this.app.use(express.raw({
|
|
114
|
-
|
|
115
|
-
|
|
140
|
+
this.app.use("/v1/traces", express.raw({
|
|
141
|
+
limit: "10mb",
|
|
142
|
+
type: (req) => this.acceptFormats.includes("protobuf") && getRequestFormat(req.headers["content-type"]) === "protobuf"
|
|
116
143
|
}));
|
|
117
|
-
logger.debug("[OtlpReceiver] Middleware configured for
|
|
144
|
+
logger.debug("[OtlpReceiver] Middleware configured for accepted OTLP formats");
|
|
118
145
|
}
|
|
119
146
|
setupRoutes() {
|
|
120
147
|
this.app.post("/v1/traces", async (req, res) => {
|
|
@@ -122,64 +149,19 @@ var OTLPReceiver = class {
|
|
|
122
149
|
const bodySize = req.body ? JSON.stringify(req.body).length : 0;
|
|
123
150
|
logger.debug(`[OtlpReceiver] Received trace request: ${req.headers["content-type"]} with ${bodySize} bytes`);
|
|
124
151
|
logger.debug("[OtlpReceiver] Starting to process traces");
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
if (!isJson && !isProtobuf) {
|
|
152
|
+
const format = getRequestFormat(contentType);
|
|
153
|
+
if (!format || !this.acceptFormats.includes(format)) {
|
|
128
154
|
res.status(415).json({ error: "Unsupported content type" });
|
|
129
155
|
return;
|
|
130
156
|
}
|
|
131
157
|
try {
|
|
132
|
-
|
|
133
|
-
if (isJson) {
|
|
134
|
-
logger.debug("[OtlpReceiver] Parsing OTLP JSON request");
|
|
135
|
-
logger.debug(`[OtlpReceiver] Request body: ${JSON.stringify(req.body).substring(0, 500)}...`);
|
|
136
|
-
traces = this.parseOTLPJSONRequest(req.body);
|
|
137
|
-
} else if (isProtobuf) {
|
|
138
|
-
logger.debug("[OtlpReceiver] Parsing OTLP protobuf request");
|
|
139
|
-
logger.debug(`[OtlpReceiver] Request body size: ${req.body?.length || 0} bytes`);
|
|
140
|
-
traces = await this.parseOTLPProtobufRequest(req.body);
|
|
141
|
-
}
|
|
158
|
+
const traces = await this.parseIncomingRequest(format, req.body);
|
|
142
159
|
logger.debug(`[OtlpReceiver] Parsed ${traces.length} traces from request`);
|
|
143
|
-
|
|
144
|
-
const traceInfoById = /* @__PURE__ */ new Map();
|
|
145
|
-
for (const trace of traces) {
|
|
146
|
-
if (!spansByTrace.has(trace.traceId)) {
|
|
147
|
-
spansByTrace.set(trace.traceId, []);
|
|
148
|
-
const evaluationId = trace.span.attributes?.["evaluation.id"];
|
|
149
|
-
const testCaseId = trace.span.attributes?.["test.case.id"];
|
|
150
|
-
const info = traceInfoById.get(trace.traceId) ?? {};
|
|
151
|
-
if (evaluationId) info.evaluationId = evaluationId;
|
|
152
|
-
if (testCaseId) info.testCaseId = testCaseId;
|
|
153
|
-
traceInfoById.set(trace.traceId, info);
|
|
154
|
-
}
|
|
155
|
-
spansByTrace.get(trace.traceId).push(trace.span);
|
|
156
|
-
}
|
|
157
|
-
logger.debug(`[OtlpReceiver] Grouped spans into ${spansByTrace.size} traces`);
|
|
158
|
-
for (const [traceId, info] of traceInfoById) try {
|
|
159
|
-
logger.debug(`[OtlpReceiver] Creating trace record for ${traceId}`);
|
|
160
|
-
await this.traceStore.createTrace({
|
|
161
|
-
traceId,
|
|
162
|
-
evaluationId: info.evaluationId || "",
|
|
163
|
-
testCaseId: info.testCaseId || ""
|
|
164
|
-
});
|
|
165
|
-
} catch (error) {
|
|
166
|
-
logger.debug(`[OtlpReceiver] Trace ${traceId} may already exist: ${error}`);
|
|
167
|
-
}
|
|
168
|
-
for (const [traceId, spans] of spansByTrace) {
|
|
169
|
-
logger.debug(`[OtlpReceiver] Storing ${spans.length} spans for trace ${traceId}`);
|
|
170
|
-
await this.traceStore.addSpans(traceId, spans, { skipTraceCheck: true });
|
|
171
|
-
}
|
|
160
|
+
await this.persistTraces(this.groupTraces(traces));
|
|
172
161
|
res.status(200).json({ partialSuccess: {} });
|
|
173
162
|
logger.debug("[OtlpReceiver] Successfully processed traces");
|
|
174
163
|
} catch (error) {
|
|
175
|
-
|
|
176
|
-
logger.error(`[OtlpReceiver] Error stack: ${error instanceof Error ? error.stack : "No stack"}`);
|
|
177
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
178
|
-
if (errorMessage.toLowerCase().includes("invalid protobuf")) {
|
|
179
|
-
res.status(400).json({ error: errorMessage });
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
res.status(500).json({ error: "Internal server error" });
|
|
164
|
+
this.handleProcessingError(error, res);
|
|
183
165
|
}
|
|
184
166
|
});
|
|
185
167
|
this.app.get("/health", (_req, res) => {
|
|
@@ -190,7 +172,7 @@ var OTLPReceiver = class {
|
|
|
190
172
|
res.status(200).json({
|
|
191
173
|
service: "promptfoo-otlp-receiver",
|
|
192
174
|
version: "1.0.0",
|
|
193
|
-
supported_formats:
|
|
175
|
+
supported_formats: this.acceptFormats
|
|
194
176
|
});
|
|
195
177
|
});
|
|
196
178
|
this.app.get("/debug/status", async (_req, res) => {
|
|
@@ -211,6 +193,71 @@ var OTLPReceiver = class {
|
|
|
211
193
|
res.status(500).json({ error: "Internal server error" });
|
|
212
194
|
});
|
|
213
195
|
}
|
|
196
|
+
async parseIncomingRequest(format, body) {
|
|
197
|
+
if (format === "json") {
|
|
198
|
+
logger.debug("[OtlpReceiver] Parsing OTLP JSON request");
|
|
199
|
+
logger.debug(`[OtlpReceiver] Request body: ${JSON.stringify(body).substring(0, 500)}...`);
|
|
200
|
+
return this.parseOTLPJSONRequest(body);
|
|
201
|
+
}
|
|
202
|
+
logger.debug("[OtlpReceiver] Parsing OTLP protobuf request");
|
|
203
|
+
logger.debug(`[OtlpReceiver] Request body size: ${body?.length || 0} bytes`);
|
|
204
|
+
return this.parseOTLPProtobufRequest(body);
|
|
205
|
+
}
|
|
206
|
+
groupTraces(traces) {
|
|
207
|
+
const spansByTrace = /* @__PURE__ */ new Map();
|
|
208
|
+
const traceInfoById = /* @__PURE__ */ new Map();
|
|
209
|
+
for (const trace of traces) {
|
|
210
|
+
const spans = spansByTrace.get(trace.traceId) ?? [];
|
|
211
|
+
spans.push(trace.span);
|
|
212
|
+
spansByTrace.set(trace.traceId, spans);
|
|
213
|
+
this.recordTraceInfo(traceInfoById, trace);
|
|
214
|
+
}
|
|
215
|
+
logger.debug(`[OtlpReceiver] Grouped spans into ${spansByTrace.size} traces`);
|
|
216
|
+
return {
|
|
217
|
+
spansByTrace,
|
|
218
|
+
traceInfoById
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
recordTraceInfo(traceInfoById, trace) {
|
|
222
|
+
const evaluationId = trace.span.attributes?.["evaluation.id"];
|
|
223
|
+
const testCaseId = trace.span.attributes?.["test.case.id"];
|
|
224
|
+
const info = traceInfoById.get(trace.traceId) ?? {};
|
|
225
|
+
if (evaluationId) info.evaluationId = evaluationId;
|
|
226
|
+
if (testCaseId) info.testCaseId = testCaseId;
|
|
227
|
+
traceInfoById.set(trace.traceId, info);
|
|
228
|
+
}
|
|
229
|
+
async persistTraces({ spansByTrace, traceInfoById }) {
|
|
230
|
+
await this.createTraceRecords(traceInfoById);
|
|
231
|
+
await this.storeSpans(spansByTrace);
|
|
232
|
+
}
|
|
233
|
+
async createTraceRecords(traceInfoById) {
|
|
234
|
+
for (const [traceId, info] of traceInfoById) try {
|
|
235
|
+
logger.debug(`[OtlpReceiver] Creating trace record for ${traceId}`);
|
|
236
|
+
await this.traceStore.createTrace({
|
|
237
|
+
traceId,
|
|
238
|
+
evaluationId: info.evaluationId || "",
|
|
239
|
+
testCaseId: info.testCaseId || ""
|
|
240
|
+
});
|
|
241
|
+
} catch (error) {
|
|
242
|
+
logger.debug(`[OtlpReceiver] Trace ${traceId} may already exist: ${error}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async storeSpans(spansByTrace) {
|
|
246
|
+
for (const [traceId, spans] of spansByTrace) {
|
|
247
|
+
logger.debug(`[OtlpReceiver] Storing ${spans.length} spans for trace ${traceId}`);
|
|
248
|
+
await this.traceStore.addSpans(traceId, spans, { skipTraceCheck: true });
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
handleProcessingError(error, res) {
|
|
252
|
+
logger.error(`[OtlpReceiver] Failed to process OTLP traces: ${error}`);
|
|
253
|
+
logger.error(`[OtlpReceiver] Error stack: ${error instanceof Error ? error.stack : "No stack"}`);
|
|
254
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
255
|
+
if (errorMessage.toLowerCase().includes("invalid protobuf")) {
|
|
256
|
+
res.status(400).json({ error: errorMessage });
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
res.status(500).json({ error: "Internal server error" });
|
|
260
|
+
}
|
|
214
261
|
parseOTLPJSONRequest(body) {
|
|
215
262
|
const traces = [];
|
|
216
263
|
logger.debug(`[OtlpReceiver] Parsing request with ${body.resourceSpans?.length || 0} resource spans`);
|
|
@@ -249,44 +296,42 @@ var OTLPReceiver = class {
|
|
|
249
296
|
return traces;
|
|
250
297
|
}
|
|
251
298
|
async parseOTLPProtobufRequest(body) {
|
|
252
|
-
const traces = [];
|
|
253
299
|
const decoded = await decodeExportTraceServiceRequest(body);
|
|
254
300
|
logger.debug(`[OtlpReceiver] Parsing protobuf request with ${decoded.resourceSpans?.length || 0} resource spans`);
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
301
|
+
return (decoded.resourceSpans || []).flatMap((resourceSpan) => this.parseDecodedResourceSpan(resourceSpan));
|
|
302
|
+
}
|
|
303
|
+
parseDecodedResourceSpan(resourceSpan) {
|
|
304
|
+
const resourceAttributes = this.parseDecodedAttributes(resourceSpan.resource?.attributes);
|
|
305
|
+
logger.debug(`[OtlpReceiver] Parsed ${Object.keys(resourceAttributes).length} resource attributes from protobuf`);
|
|
306
|
+
return (resourceSpan.scopeSpans || []).flatMap((scopeSpan) => (scopeSpan.spans || []).map((span) => this.createDecodedParsedTrace(resourceAttributes, scopeSpan, span)));
|
|
307
|
+
}
|
|
308
|
+
createDecodedParsedTrace(resourceAttributes, scopeSpan, span) {
|
|
309
|
+
const traceId = bytesToHex(span.traceId, 32);
|
|
310
|
+
const spanId = bytesToHex(span.spanId, 16);
|
|
311
|
+
const parentSpanId = span.parentSpanId?.length ? bytesToHex(span.parentSpanId, 16) : void 0;
|
|
312
|
+
logger.debug(`[OtlpReceiver] Processing protobuf span: ${span.name} (${spanId}) in trace ${traceId}`);
|
|
313
|
+
const spanKindCode = span.kind ?? 0;
|
|
314
|
+
const spanKindName = SPAN_KIND_MAP[spanKindCode] ?? "unspecified";
|
|
315
|
+
return {
|
|
316
|
+
traceId,
|
|
317
|
+
span: {
|
|
318
|
+
spanId,
|
|
319
|
+
parentSpanId,
|
|
320
|
+
name: span.name,
|
|
321
|
+
startTime: this.toMilliseconds(span.startTimeUnixNano) ?? 0,
|
|
322
|
+
endTime: this.toMilliseconds(span.endTimeUnixNano),
|
|
323
|
+
attributes: {
|
|
265
324
|
...resourceAttributes,
|
|
266
325
|
...this.parseDecodedAttributes(span.attributes),
|
|
267
326
|
"otel.scope.name": scopeSpan.scope?.name,
|
|
268
327
|
"otel.scope.version": scopeSpan.scope?.version,
|
|
269
328
|
"otel.span.kind": spanKindName,
|
|
270
|
-
"otel.span.kind_code":
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
traces.push({
|
|
275
|
-
traceId,
|
|
276
|
-
span: {
|
|
277
|
-
spanId,
|
|
278
|
-
parentSpanId,
|
|
279
|
-
name: span.name,
|
|
280
|
-
startTime: startTimeNano / 1e6,
|
|
281
|
-
endTime: endTimeNano ? endTimeNano / 1e6 : void 0,
|
|
282
|
-
attributes,
|
|
283
|
-
statusCode: span.status?.code,
|
|
284
|
-
statusMessage: span.status?.message
|
|
285
|
-
}
|
|
286
|
-
});
|
|
329
|
+
"otel.span.kind_code": spanKindCode
|
|
330
|
+
},
|
|
331
|
+
statusCode: span.status?.code,
|
|
332
|
+
statusMessage: span.status?.message
|
|
287
333
|
}
|
|
288
|
-
}
|
|
289
|
-
return traces;
|
|
334
|
+
};
|
|
290
335
|
}
|
|
291
336
|
parseDecodedAttributes(attributes) {
|
|
292
337
|
if (!attributes) return {};
|
|
@@ -387,15 +432,26 @@ var OTLPReceiver = class {
|
|
|
387
432
|
getApp() {
|
|
388
433
|
return this.app;
|
|
389
434
|
}
|
|
435
|
+
setAcceptFormats(acceptFormats) {
|
|
436
|
+
this.acceptFormats = normalizeAcceptFormats(acceptFormats);
|
|
437
|
+
}
|
|
438
|
+
toMilliseconds(value) {
|
|
439
|
+
if (value === void 0) return;
|
|
440
|
+
return Number(value) / 1e6;
|
|
441
|
+
}
|
|
390
442
|
};
|
|
391
443
|
let otlpReceiver = null;
|
|
392
|
-
function getOTLPReceiver() {
|
|
393
|
-
if (
|
|
444
|
+
function getOTLPReceiver(options) {
|
|
445
|
+
if (otlpReceiver) {
|
|
446
|
+
otlpReceiver.setAcceptFormats(options?.acceptFormats);
|
|
447
|
+
return otlpReceiver;
|
|
448
|
+
}
|
|
449
|
+
otlpReceiver = new OTLPReceiver(options);
|
|
394
450
|
return otlpReceiver;
|
|
395
451
|
}
|
|
396
|
-
async function startOTLPReceiver(port, host) {
|
|
452
|
+
async function startOTLPReceiver(port, host, acceptFormats) {
|
|
397
453
|
logger.debug("[OtlpReceiver] Starting receiver through startOTLPReceiver function");
|
|
398
|
-
await getOTLPReceiver().listen(port, host);
|
|
454
|
+
await getOTLPReceiver({ acceptFormats }).listen(port, host);
|
|
399
455
|
}
|
|
400
456
|
async function stopOTLPReceiver() {
|
|
401
457
|
logger.debug("[OtlpReceiver] Stopping receiver through stopOTLPReceiver function");
|
|
@@ -407,4 +463,4 @@ async function stopOTLPReceiver() {
|
|
|
407
463
|
//#endregion
|
|
408
464
|
export { startOTLPReceiver, stopOTLPReceiver };
|
|
409
465
|
|
|
410
|
-
//# sourceMappingURL=otlpReceiver-
|
|
466
|
+
//# sourceMappingURL=otlpReceiver-BntK801g.js.map
|