@sazabi/cli 0.13.17-dev.gb178683 → 0.13.17-dev.gbf99bb0
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/dist/index.js +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -6766,7 +6766,7 @@ When events are arriving, report back:
|
|
|
6766
6766
|
- That events are landing, with payload fields preserved under \`webhook.*\`.
|
|
6767
6767
|
|
|
6768
6768
|
Do not print \`PUBLIC_KEY\` (or the full keyed URL) in the summary.
|
|
6769
|
-
`;var SD=()=>{};var TD,AD;var CD=g(()=>{UA();KA();GA();BA();HA();WA();XA();FA();VA();tC();oC();rC();cC();hC();uC();dC();yC();mC();vC();fC();OC();SC();TC();CC();DC();NC();jC();UC();KC();GC();BC();HC();WC();XC();FC();VC();tL();oL();rL();cL();hL();uL();dL();yL();mL();vL();fL();OL();SL();TL();CL();DL();NL();jL();UL();KL();GL();BL();HL();WL();XL();FL();VL();tD();oD();rD();cD();hD();uD();dD();yD();mD();vD();fD();OD();SD();TD={cloudflare:EA.trim(),cloudflare_workers:JA.trim(),cloudwatch:MA.trim(),convex:ZA.trim(),datadog:eC.trim(),daytona:iC.trim(),digital_ocean:sC.trim(),e2b:gC.trim(),elastic_cloud:pC.trim(),fluent_bit:kC.trim(),fly_io:PC.trim(),gcp:AC.trim(),grafana_alloy:zC.trim(),inngest:RC.trim(),langchain:xC.trim(),mastra:qC.trim(),neon:YC.trim(),netlify:QC.trim(),openrouter:nL.trim(),otel:aL.trim(),otel_collector:lL.trim(),otel_metrics:bL.trim(),plain:wL.trim(),posthog:$L.trim(),posthog_sdk:LL.trim(),porter:IL.trim(),prometheus:_L.trim(),railway:EL.trim(),render:JL.trim(),respan:ML.trim(),sentry:ZL.trim(),sentry_platform:eD.trim(),supabase:iD.trim(),temporal:sD.trim(),trigger_dev:gD.trim(),vector:pD.trim(),vercel:kD.trim(),webhook_events:PD.trim()},AD={cloudflare:xA.trim(),cloudflare_workers:qA.trim(),cloudwatch:YA.trim(),convex:QA.trim(),datadog:nC.trim(),daytona:aC.trim(),digital_ocean:lC.trim(),e2b:bC.trim(),elastic_cloud:wC.trim(),fluent_bit:IC.trim(),fly_io:$C.trim(),gcp:LC.trim(),grafana_alloy:_C.trim(),inngest:EC.trim(),langchain:JC.trim(),mastra:MC.trim(),neon:ZC.trim(),netlify:eL.trim(),openrouter:iL.trim(),otel:sL.trim(),otel_collector:gL.trim(),otel_metrics:pL.trim(),plain:kL.trim(),posthog:AL.trim(),posthog_sdk:zL.trim(),porter:PL.trim(),prometheus:RL.trim(),railway:xL.trim(),render:qL.trim(),respan:YL.trim(),sentry:QL.trim(),sentry_platform:nD.trim(),supabase:aD.trim(),temporal:lD.trim(),trigger_dev:bD.trim(),vector:wD.trim(),vercel:ID.trim(),webhook_events:$D.trim()}});var gv=(e)=>{let t=AD[e];if(t)return t;return TD[e]};var LD=g(()=>{CD()});var H="available";var Ee,zh=(e)=>[`Add the OpenTelemetry SDK to your ${e}. Most languages have official OpenTelemetry SDKs available (e.g., \`@opentelemetry/api\` for Node.js, \`opentelemetry-api\` for Python, etc.).`,`Initialize OpenTelemetry in your ${e}.`,`Set the following environment variables in your ${e} environment.`],_o=(e="http/protobuf")=>[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_ENDPOINT`",value:"https://${context.ingestHost}",copyLabel:"OTLP endpoint"},{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:e,copyLabel:"OTLP protocol"}],Nh;var pt=g(()=>{Ee={label:"Connect",pendingLabel:"Connecting..."},Nh={kind:"prose",text:"Most OpenTelemetry SDKs automatically detect these environment variables. If your SDK is already configured in code, use the same endpoint and protocol values there instead."}});var dv,bv,yv;var DD=g(()=>{pt();dv={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Cloudflare token with Logpush permissions.",steps:[{kind:"prose",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."},{kind:"prose",text:"Create a Cloudflare API token with **Account Settings: Read**, **Zone: Read**, and **Zone Logs: Edit** permissions."},{kind:"prose",text:"Pick the account you want to connect, click **Continue to summary**, then **Create Token**, and copy the token for the next step."},{kind:"external-link",label:"Open Cloudflare API token template",href:"https://dash.cloudflare.com/profile/api-tokens?permissionGroupKeys=%5B%7B%22key%22%3A%22account_settings%22%2C%22type%22%3A%22read%22%2C%22scope%22%3A%22account%22%7D%2C%7B%22key%22%3A%22logs%22%2C%22type%22%3A%22edit%22%2C%22scope%22%3A%22zone%22%7D%2C%7B%22key%22%3A%22zone%22%2C%22type%22%3A%22read%22%2C%22scope%22%3A%22zone%22%7D%5D&name=Sazabi+Cloudflare+Logpush"}]},{id:"credentials",title:"Enter credentials",description:"Enter your token and account ID.",steps:[{id:"token",kind:"secret",label:"Cloudflare API token",instruction:"Enter your Cloudflare API token below.",description:"Token with Account Settings Read, Zone Read, and Logs Edit permissions.",placeholder:"Enter your Cloudflare API token"},{id:"accountId",kind:"text",label:"Cloudflare account ID",instruction:"Enter your Cloudflare account ID below.",description:"The 32-character hex ID from your Cloudflare dashboard URL or account overview.",placeholder:"e.g. a1b2c3d4e5f6...",pattern:"^[a-f0-9]{32}$",patternMessage:"Enter the 32-character Cloudflare account ID."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token",accountId:"$accountId"},resultAs:"validate"}],metadata:{connectionMode:"managed",cloudflareApiToken:"$token",accountId:"$accountId",accountName:"$validate.accountName"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/cloudflare"},bv={content:{kind:"list",listAction:"listLogpushDatasets",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"datasetName",header:"Dataset",cell:"badge"},{field:"scopeDetail",header:"Scope"}],searchPlaceholder:"Search datasets and zones...",searchFields:["datasetName","scopeDetail"],dedupeByConfigField:["scope","zoneId","dataset"],dedupeMissingFieldAsEmpty:!0,emptyState:{noMatches:"No Logpush datasets match your search.",allConfigured:"All Logpush datasets already have streams configured."},toStreamItem:{displayName:"$item.displayName",config:{scope:"$item.scope",accountId:"$item.accountId",zoneId:"$item.zoneId",zoneName:"$item.zoneName",dataset:"$item.dataset",datasetName:"$item.datasetName"}}}},yv={groups:[{id:"open-logpush",section:"config",title:"Open Logpush",description:"Create an HTTP Logpush job in Cloudflare.",steps:[{kind:"note",variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."},{kind:"prose",text:"Create a Logpush job in your [Cloudflare dashboard](https://dash.cloudflare.com) under **Analytics & Logs > Logpush**, or via the Cloudflare API."},{kind:"prose",text:"Select **HTTP** as the destination type."}]},{id:"destination",section:"endpoint",title:"Copy destination URL",description:"Paste your Sazabi intake URL (above) into the Logpush HTTP destination field.",steps:[{kind:"copyable",label:"Destination URL",value:"https://${context.ingestHost}/v1/logs"}]},{id:"output-options",section:"config",title:"Set output options",description:"Use a timestamp format Sazabi can parse reliably.",steps:[{kind:"prose",text:"In the Logpush job's **Output options**, set **Timestamp format** to **RFC3339** so Sazabi can parse event times accurately."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/cloudflare"}});var YQ,zD;var ND=g(()=>{DD();YQ=["cloudflareApiToken"],zD={id:"cloudflare",name:"Cloudflare Logpush",searchAliases:["cloudflare","cf","logpush"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:YQ,subtitle:"Stream your Cloudflare Logpush jobs to Sazabi for edge network observability.",features:["Zone Logpush","Account Logpush","Edge analytics"],evidenceHints:["Cloudflare zones, account Logpush config, or Terraform cloudflare provider","CLOUDFLARE_* environment variables or scripts that call the Cloudflare API","README/docs naming Cloudflare for edge, DNS, CDN, firewall, or Workers traffic"],setupSkill:H,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare-logpush",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"cloudflare.validateToken"}},list:{listLogpushDatasets:{procedure:"cloudflare.listLogpushDatasets",itemsField:"items"}}}}}});var pv;var _D=g(()=>{pv={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/data/sources/endpoint/cloudflare-workers",groups:[{id:"open-telemetry",section:"config",title:"Open telemetry destinations",description:"Add separate Cloudflare Workers Observability destinations for logs and traces.",steps:[{kind:"prose",text:"In your Cloudflare dashboard, go to **Workers & Pages > Observability > Telemetry** and click **Add Destination**."},{kind:"prose",text:"Add one destination for logs and a second for traces."}]},{id:"logs",section:"endpoint",title:"Configure logs destination",description:"Paste these values into Cloudflare's **Add New Destination** dialog for logs.",steps:[{kind:"copyable",label:"Destination type",value:"Logs"},{kind:"copyable",label:"OTLP logs endpoint",value:"https://${context.ingestHost}/v1/logs"},{kind:"copyable",label:"Destination name",value:"sazabi-logs"}]},{id:"traces",section:"endpoint",title:"Configure traces destination",description:"Paste these values into Cloudflare's **Add New Destination** dialog for traces.",steps:[{kind:"copyable",label:"Destination type",value:"Traces"},{kind:"copyable",label:"OTLP traces endpoint",value:"https://${context.ingestHost}/v1/traces"},{kind:"copyable",label:"Destination name",value:"sazabi-traces"}]},{id:"enable-worker",section:"config",title:"Enable destinations",description:"Opt each Worker into the destination names you created.",steps:[{kind:"prose",text:"In each Worker's `wrangler.jsonc` / `wrangler.toml`, enable observability and list the log and trace destination names you created."},{kind:"prose",text:"Redeploy the Worker after updating Wrangler config. The destination is enabled only after the deployed Worker references it by name."}]}]}});var jD;var RD=g(()=>{_D();jD={id:"cloudflare_workers",name:"Cloudflare Workers",searchAliases:["cloudflare","cf","workers"],capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleEligible:!0,subtitle:"Stream Cloudflare Workers Observability logs and traces to Sazabi via OTLP.",features:["Workers Observability OTLP logs","Workers Observability OTLP traces"],evidenceHints:["wrangler.toml/json config with observability or Workers deployments","@cloudflare/workers-types, hono on Workers, or Worker entrypoints such as src/worker.ts","README/docs naming Cloudflare Workers, Pages Functions, or Durable Objects"],setupSkill:H,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare",streamSelectorLayout:"sidepanel"},streamCardinality:"multi"}});var mv,wv,vv,kv,fv,Iv;var UD=g(()=>{pt();mv={action:"prefetch",input:{projectId:"${context.projectId}",templateUrl:"${context.cloudformationTemplateUrl}"},resultAs:"cloudwatch"},wv={id:"role-arn",title:"Enter role ARN",description:"Enter the IAM Role ARN created by your selected setup method.",steps:[{id:"arn",kind:"text",label:"Role ARN",instruction:"Enter the IAM role ARN below.",placeholder:"arn:aws:iam::123456789012:role/SazabiLogIngestion-Sazabi-...",pattern:"^arn:aws:iam::(\\d{12}):role\\/[\\w+=,.@\\-\\/]+$",patternMessage:"Invalid ARN format. Expected: arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"}]},vv={actions:[{kind:"validate",action:"validate",input:{projectId:"${context.projectId}",roleArn:"$arn",externalId:"${context.extras.cloudwatch.externalId}"},resultAs:"validateRole"}],metadata:{roleArn:"$arn",awsAccountId:"$validateRole.awsAccountId",externalId:"${context.extras.cloudwatch.externalId}",connectionMode:"managed"},displayName:"AWS Account $validateRole.awsAccountId",button:Ee},kv={kind:"choice",title:"Choose setup method",description:"Select how you want to create the CloudWatch IAM role.",options:[{id:"cloudformation",label:"CloudFormation",description:"Launch a stack with the required trust and permissions.",flow:{kind:"multi-step",prefetch:mv,steps:[{id:"prepare",title:"Launch stack",description:"Create the IAM role from Sazabi's CloudFormation template.",steps:[{kind:"prose",text:"Launch a CloudFormation stack in your AWS account to create the IAM role that lets Sazabi read your CloudWatch logs."},{kind:"external-link",label:"Launch CloudFormation stack",href:"${context.extras.cloudwatch.cloudFormationQuickCreateUrl}"},{kind:"prose",text:"After the stack is created, find your role ARN under **Stacks → ${context.extras.cloudwatch.stackName} → Outputs** and copy the `RoleArn` value."}]},wv],submit:vv}},{id:"terraform",label:"Terraform",description:"Apply Terraform resources in your AWS account.",flow:{kind:"multi-step",prefetch:mv,steps:[{id:"prepare",title:"Apply Terraform",description:"Add the IAM role and policy resources to your Terraform stack.",steps:[{kind:"prose",text:"Add this configuration to your Terraform files. It creates the IAM role that lets Sazabi read your CloudWatch logs."},{kind:"code",language:"hcl",copyLabel:"Terraform",value:`data "aws_caller_identity" "current" {}
|
|
6769
|
+
`;var SD=()=>{};var TD,AD;var CD=g(()=>{UA();KA();GA();BA();HA();WA();XA();FA();VA();tC();oC();rC();cC();hC();uC();dC();yC();mC();vC();fC();OC();SC();TC();CC();DC();NC();jC();UC();KC();GC();BC();HC();WC();XC();FC();VC();tL();oL();rL();cL();hL();uL();dL();yL();mL();vL();fL();OL();SL();TL();CL();DL();NL();jL();UL();KL();GL();BL();HL();WL();XL();FL();VL();tD();oD();rD();cD();hD();uD();dD();yD();mD();vD();fD();OD();SD();TD={cloudflare:EA.trim(),cloudflare_workers:JA.trim(),cloudwatch:MA.trim(),convex:ZA.trim(),datadog:eC.trim(),daytona:iC.trim(),digital_ocean:sC.trim(),e2b:gC.trim(),elastic_cloud:pC.trim(),fluent_bit:kC.trim(),fly_io:PC.trim(),gcp:AC.trim(),grafana_alloy:zC.trim(),inngest:RC.trim(),langchain:xC.trim(),mastra:qC.trim(),neon:YC.trim(),netlify:QC.trim(),openrouter:nL.trim(),otel:aL.trim(),otel_collector:lL.trim(),otel_metrics:bL.trim(),plain:wL.trim(),posthog:$L.trim(),posthog_sdk:LL.trim(),porter:IL.trim(),prometheus:_L.trim(),railway:EL.trim(),render:JL.trim(),respan:ML.trim(),sentry:ZL.trim(),sentry_platform:eD.trim(),supabase:iD.trim(),temporal:sD.trim(),trigger_dev:gD.trim(),vector:pD.trim(),vercel:kD.trim(),webhook_events:PD.trim()},AD={cloudflare:xA.trim(),cloudflare_workers:qA.trim(),cloudwatch:YA.trim(),convex:QA.trim(),datadog:nC.trim(),daytona:aC.trim(),digital_ocean:lC.trim(),e2b:bC.trim(),elastic_cloud:wC.trim(),fluent_bit:IC.trim(),fly_io:$C.trim(),gcp:LC.trim(),grafana_alloy:_C.trim(),inngest:EC.trim(),langchain:JC.trim(),mastra:MC.trim(),neon:ZC.trim(),netlify:eL.trim(),openrouter:iL.trim(),otel:sL.trim(),otel_collector:gL.trim(),otel_metrics:pL.trim(),plain:kL.trim(),posthog:AL.trim(),posthog_sdk:zL.trim(),porter:PL.trim(),prometheus:RL.trim(),railway:xL.trim(),render:qL.trim(),respan:YL.trim(),sentry:QL.trim(),sentry_platform:nD.trim(),supabase:aD.trim(),temporal:lD.trim(),trigger_dev:bD.trim(),vector:wD.trim(),vercel:ID.trim(),webhook_events:$D.trim()}});var gv=(e)=>{let t=AD[e];if(t)return t;return TD[e]};var LD=g(()=>{CD()});var H="available";var Ee,zh=(e)=>[`Add the OpenTelemetry SDK to your ${e}. Most languages have official OpenTelemetry SDKs available (e.g., \`@opentelemetry/api\` for Node.js, \`opentelemetry-api\` for Python, etc.).`,`Initialize OpenTelemetry in your ${e}.`,`Set the following environment variables in your ${e} environment.`],_o=(e="http/protobuf")=>[{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_ENDPOINT`",value:"https://${context.ingestHost}",copyLabel:"OTLP endpoint"},{kind:"copyable",label:"`OTEL_EXPORTER_OTLP_PROTOCOL`",value:e,copyLabel:"OTLP protocol"}],Nh;var pt=g(()=>{Ee={label:"Connect",pendingLabel:"Connecting..."},Nh={kind:"prose",text:"Most OpenTelemetry SDKs automatically detect these environment variables. If your SDK is already configured in code, use the same endpoint and protocol values there instead."}});var dv,bv,yv;var DD=g(()=>{pt();dv={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Cloudflare token with Logpush permissions.",steps:[{kind:"note",variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."},{kind:"prose",text:"Create a Cloudflare API token with **Account Settings: Read**, **Zone: Read**, and **Zone Logs: Edit** permissions."},{kind:"prose",text:"Pick the account you want to connect, click **Continue to summary**, then **Create Token**, and copy the token for the next step."},{kind:"external-link",label:"Open Cloudflare API token template",href:"https://dash.cloudflare.com/profile/api-tokens?permissionGroupKeys=%5B%7B%22key%22%3A%22account_settings%22%2C%22type%22%3A%22read%22%2C%22scope%22%3A%22account%22%7D%2C%7B%22key%22%3A%22logs%22%2C%22type%22%3A%22edit%22%2C%22scope%22%3A%22zone%22%7D%2C%7B%22key%22%3A%22zone%22%2C%22type%22%3A%22read%22%2C%22scope%22%3A%22zone%22%7D%5D&name=Sazabi+Cloudflare+Logpush"}]},{id:"credentials",title:"Enter credentials",description:"Enter your token and account ID.",steps:[{id:"token",kind:"secret",label:"Cloudflare API token",instruction:"Enter your Cloudflare API token below.",description:"Token with Account Settings Read, Zone Read, and Logs Edit permissions.",placeholder:"Enter your Cloudflare API token"},{id:"accountId",kind:"text",label:"Cloudflare account ID",instruction:"Enter your Cloudflare account ID below.",description:"The 32-character hex ID from your Cloudflare dashboard URL or account overview.",placeholder:"e.g. a1b2c3d4e5f6...",pattern:"^[a-f0-9]{32}$",patternMessage:"Enter the 32-character Cloudflare account ID."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token",accountId:"$accountId"},resultAs:"validate"}],metadata:{connectionMode:"managed",cloudflareApiToken:"$token",accountId:"$accountId",accountName:"$validate.accountName"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/cloudflare"},bv={content:{kind:"list",listAction:"listLogpushDatasets",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"datasetName",header:"Dataset",cell:"badge"},{field:"scopeDetail",header:"Scope"}],searchPlaceholder:"Search datasets and zones...",searchFields:["datasetName","scopeDetail"],dedupeByConfigField:["scope","zoneId","dataset"],dedupeMissingFieldAsEmpty:!0,emptyState:{noMatches:"No Logpush datasets match your search.",allConfigured:"All Logpush datasets already have streams configured."},toStreamItem:{displayName:"$item.displayName",config:{scope:"$item.scope",accountId:"$item.accountId",zoneId:"$item.zoneId",zoneName:"$item.zoneName",dataset:"$item.dataset",datasetName:"$item.datasetName"}}}},yv={groups:[{id:"open-logpush",section:"config",title:"Open Logpush",description:"Create an HTTP Logpush job in Cloudflare.",steps:[{kind:"note",variant:"requirement",text:"**Cloudflare Logpush is only available on the Enterprise plan.** Free, Pro, and Business accounts cannot create Logpush jobs."},{kind:"prose",text:"Create a Logpush job in your [Cloudflare dashboard](https://dash.cloudflare.com) under **Analytics & Logs > Logpush**, or via the Cloudflare API."},{kind:"prose",text:"Select **HTTP** as the destination type."}]},{id:"destination",section:"endpoint",title:"Copy destination URL",description:"Paste your Sazabi intake URL (above) into the Logpush HTTP destination field.",steps:[{kind:"copyable",label:"Destination URL",value:"https://${context.ingestHost}/v1/logs"}]},{id:"output-options",section:"config",title:"Set output options",description:"Use a timestamp format Sazabi can parse reliably.",steps:[{kind:"prose",text:"In the Logpush job's **Output options**, set **Timestamp format** to **RFC3339** so Sazabi can parse event times accurately."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/cloudflare"}});var YQ,zD;var ND=g(()=>{DD();YQ=["cloudflareApiToken"],zD={id:"cloudflare",name:"Cloudflare Logpush",searchAliases:["cloudflare","cf","logpush"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:YQ,subtitle:"Stream your Cloudflare Logpush jobs to Sazabi for edge network observability.",features:["Zone Logpush","Account Logpush","Edge analytics"],evidenceHints:["Cloudflare zones, account Logpush config, or Terraform cloudflare provider","CLOUDFLARE_* environment variables or scripts that call the Cloudflare API","README/docs naming Cloudflare for edge, DNS, CDN, firewall, or Workers traffic"],setupSkill:H,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare-logpush",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"cloudflare.validateToken"}},list:{listLogpushDatasets:{procedure:"cloudflare.listLogpushDatasets",itemsField:"items"}}}}}});var pv;var _D=g(()=>{pv={perStreamInstructions:!0,docsUrl:"https://docs.sazabi.com/data/sources/endpoint/cloudflare-workers",groups:[{id:"open-telemetry",section:"config",title:"Open telemetry destinations",description:"Add separate Cloudflare Workers Observability destinations for logs and traces.",steps:[{kind:"prose",text:"In your Cloudflare dashboard, go to **Workers & Pages > Observability > Telemetry** and click **Add Destination**."},{kind:"prose",text:"Add one destination for logs and a second for traces."}]},{id:"logs",section:"endpoint",title:"Configure logs destination",description:"Paste these values into Cloudflare's **Add New Destination** dialog for logs.",steps:[{kind:"copyable",label:"Destination type",value:"Logs"},{kind:"copyable",label:"OTLP logs endpoint",value:"https://${context.ingestHost}/v1/logs"},{kind:"copyable",label:"Destination name",value:"sazabi-logs"}]},{id:"traces",section:"endpoint",title:"Configure traces destination",description:"Paste these values into Cloudflare's **Add New Destination** dialog for traces.",steps:[{kind:"copyable",label:"Destination type",value:"Traces"},{kind:"copyable",label:"OTLP traces endpoint",value:"https://${context.ingestHost}/v1/traces"},{kind:"copyable",label:"Destination name",value:"sazabi-traces"}]},{id:"enable-worker",section:"config",title:"Enable destinations",description:"Opt each Worker into the destination names you created.",steps:[{kind:"prose",text:"In each Worker's `wrangler.jsonc` / `wrangler.toml`, enable observability and list the log and trace destination names you created."},{kind:"prose",text:"Redeploy the Worker after updating Wrangler config. The destination is enabled only after the deployed Worker references it by name."}]}]}});var jD;var RD=g(()=>{_D();jD={id:"cloudflare_workers",name:"Cloudflare Workers",searchAliases:["cloudflare","cf","workers"],capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleEligible:!0,subtitle:"Stream Cloudflare Workers Observability logs and traces to Sazabi via OTLP.",features:["Workers Observability OTLP logs","Workers Observability OTLP traces"],evidenceHints:["wrangler.toml/json config with observability or Workers deployments","@cloudflare/workers-types, hono on Workers, or Worker entrypoints such as src/worker.ts","README/docs naming Cloudflare Workers, Pages Functions, or Durable Objects"],setupSkill:H,dashboard:{iconKey:"cloudflare",intakeSourceId:"cloudflare",streamSelectorLayout:"sidepanel"},streamCardinality:"multi"}});var mv,wv,vv,kv,fv,Iv;var UD=g(()=>{pt();mv={action:"prefetch",input:{projectId:"${context.projectId}",templateUrl:"${context.cloudformationTemplateUrl}"},resultAs:"cloudwatch"},wv={id:"role-arn",title:"Enter role ARN",description:"Enter the IAM Role ARN created by your selected setup method.",steps:[{id:"arn",kind:"text",label:"Role ARN",instruction:"Enter the IAM role ARN below.",placeholder:"arn:aws:iam::123456789012:role/SazabiLogIngestion-Sazabi-...",pattern:"^arn:aws:iam::(\\d{12}):role\\/[\\w+=,.@\\-\\/]+$",patternMessage:"Invalid ARN format. Expected: arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"}]},vv={actions:[{kind:"validate",action:"validate",input:{projectId:"${context.projectId}",roleArn:"$arn",externalId:"${context.extras.cloudwatch.externalId}"},resultAs:"validateRole"}],metadata:{roleArn:"$arn",awsAccountId:"$validateRole.awsAccountId",externalId:"${context.extras.cloudwatch.externalId}",connectionMode:"managed"},displayName:"AWS Account $validateRole.awsAccountId",button:Ee},kv={kind:"choice",title:"Choose setup method",description:"Select how you want to create the CloudWatch IAM role.",options:[{id:"cloudformation",label:"CloudFormation",description:"Launch a stack with the required trust and permissions.",flow:{kind:"multi-step",prefetch:mv,steps:[{id:"prepare",title:"Launch stack",description:"Create the IAM role from Sazabi's CloudFormation template.",steps:[{kind:"prose",text:"Launch a CloudFormation stack in your AWS account to create the IAM role that lets Sazabi read your CloudWatch logs."},{kind:"external-link",label:"Launch CloudFormation stack",href:"${context.extras.cloudwatch.cloudFormationQuickCreateUrl}"},{kind:"prose",text:"After the stack is created, find your role ARN under **Stacks → ${context.extras.cloudwatch.stackName} → Outputs** and copy the `RoleArn` value."}]},wv],submit:vv}},{id:"terraform",label:"Terraform",description:"Apply Terraform resources in your AWS account.",flow:{kind:"multi-step",prefetch:mv,steps:[{id:"prepare",title:"Apply Terraform",description:"Add the IAM role and policy resources to your Terraform stack.",steps:[{kind:"prose",text:"Add this configuration to your Terraform files. It creates the IAM role that lets Sazabi read your CloudWatch logs."},{kind:"code",language:"hcl",copyLabel:"Terraform",value:`data "aws_caller_identity" "current" {}
|
|
6770
6770
|
|
|
6771
6771
|
resource "aws_iam_role" "sazabi_log_ingestion" {
|
|
6772
6772
|
name = "SazabiLogIngestion"
|
|
@@ -7073,7 +7073,7 @@ output {
|
|
|
7073
7073
|
port 443
|
|
7074
7074
|
logs_uri /v1/logs
|
|
7075
7075
|
tls on
|
|
7076
|
-
tls.verify on`}]}]},{id:"restart",section:"verify",title:"Restart and verify",description:"Restart Fluent Bit after changing the output configuration.",steps:[{kind:"prose",text:"Restart Fluent Bit so it picks up the updated output configuration, then trigger some log activity."},{kind:"note",text:"If logs do not appear after restart, check the Fluent Bit process logs for TLS, DNS, or authorization errors."}]}]}});var az;var cz=g(()=>{rz();az={id:"fluent_bit",name:"Fluent Bit",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward logs from your Kubernetes cluster or any infrastructure to Sazabi using the Fluent Bit agent.",features:["Kubernetes DaemonSet","Container log collection","Multi-pipeline routing","Low resource footprint"],evidenceHints:["fluent-bit.conf, parsers.conf, Helm values, or Kubernetes DaemonSets","Fluent Bit outputs already shipping container logs","README/docs naming Fluent Bit as the log forwarder"],setupSkill:H,dashboard:{iconKey:"fluent-bit",intakeSourceId:"fluent-bit"}}});var _v,jv,Rv;var sz=g(()=>{pt();_v={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a read-only Fly.io organization token.",steps:[{kind:"prose",text:"From the CLI: `flyctl tokens create readonly -o <org-slug>`."},{kind:"prose",text:"Or open the org's Tokens tab in the [Fly.io dashboard](https://fly.io/dashboard) and create a read-only token."}]},{id:"credentials",title:"Enter credentials",description:"Enter the token and organization slug Sazabi should use.",steps:[{id:"token",kind:"secret",label:"API token",instruction:"Enter your Fly.io API token below.",placeholder:"FlyV1 ..."},{id:"orgSlug",kind:"text",label:"Organization slug",instruction:"Enter your organization slug below.",placeholder:"personal"}]}],submit:{actions:[{kind:"validate",action:"validate",input:{dataSourceType:"fly_io",metadata:{apiToken:"$token",organizationSlug:"$orgSlug"}}}],metadata:{connectionMode:"managed",apiToken:"$token",organizationSlug:"$orgSlug"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/fly-io"},jv={groups:[{id:"shipper",section:"config",title:"Run a log shipper",description:"Fly.io has no managed log-drain API, so you run a log shipper inside your Fly organization and point it at Sazabi.",steps:[{kind:"note",text:"Fly forwards logs from its internal NATS log stream, so you deploy a shipper into the **same Fly organization** as the apps you want to monitor. The shipper is required either way — to also let Sazabi discover and verify your apps from a read-only token, connect your Fly.io account instead."},{kind:"prose",text:"Pick a log-shipper option — you run **one**, not both. **Option A — fly-log-shipper (simplest):** launch the stock [superfly/fly-log-shipper](https://github.com/superfly/fly-log-shipper) image in your org and enable its generic `http` sink with the two secrets below; Sazabi parses Fly's native JSON event format directly. **Option B — dedicated OTLP shipper:** for per-app keys and richer OTLP resource attributes, build a Vector app that wraps events in an OTLP `resourceLogs` envelope and POSTs to the OTLP endpoint below."}]},{id:"endpoint",section:"endpoint",title:"Set the shipper secrets",description:"Paste these into the fly-log-shipper app (Option A). The `/fly-log-shipper` path tells Sazabi to parse Fly's native event format.",steps:[{kind:"copyable",label:"`HTTP_URL`",value:"https://${context.ingestHost}/fly-log-shipper",description:"The `/fly-log-shipper` path suffix is required — it routes the payload to the Fly event parser."},{kind:"copyable",label:"`HTTP_TOKEN`",value:"${context.publicKey}",description:"Your Sazabi public key, sent as a bearer token. Paste the raw key with no `Bearer ` prefix."},{kind:"code",label:"Set both secrets on the shipper app",language:"bash",value:'fly secrets set -a <log-shipper-app> \\\n HTTP_URL="https://${context.ingestHost}/fly-log-shipper" \\\n HTTP_TOKEN="${context.publicKey}"'},{kind:"note",text:"**Option B (dedicated OTLP shipper)** uses the endpoint below instead of the two secrets above: POST OTLP `resourceLogs` here with the same public key as a bearer token. The full `Dockerfile` and `vector.toml` are in the setup guide."},{kind:"showIngestUrl",label:"OTLP endpoint (Option B)",pathSuffix:"/v1/logs",description:"POST OTLP `resourceLogs` here, with your Sazabi public key as a bearer token."}]},{id:"verify",section:"verify",title:"Deploy and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"Deploy the shipper, then trigger activity — deploy an app or hit a deployed route. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/fly-io"},Rv={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"}],searchPlaceholder:"Search apps...",searchFields:["name"],dedupeByConfigField:"appName",emptyState:{noMatches:"No apps found.",allConfigured:"All apps already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{appName:"$item.name"}}}}});var QQ,hz;var lz=g(()=>{sz();QQ=["apiToken"],hz={id:"fly_io",name:"Fly.io",searchAliases:["fly","flyio"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:QQ,subtitle:"Forward your Fly.io application logs directly to Sazabi for global monitoring.",features:["Log shipping","Multi-region logs","Machine monitoring"],evidenceHints:["fly.toml or .fly/ app configuration","FLY_* environment variables or scripts that run flyctl/fly deploy","README/docs naming Fly.io as the deployment host"],setupSkill:H,dashboard:{iconKey:"fly-io",intakeSourceId:"fly-io",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"dataSources.validateConnection"}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var Uv,Ev,Kv;var uz=g(()=>{pt();Uv={kind:"choice",title:"Choose setup method",description:"Select how you want to connect Google Cloud logs.",options:[{id:"service-account",label:"Service account",description:"Let Sazabi set up the log sink, Pub/Sub topic, and pull subscription automatically.",flow:{kind:"multi-step",steps:[{id:"prepare",title:"Prepare access",description:"Create a service account key with permissions for log forwarding.",steps:[{kind:"prose",text:"Provide a GCP service account key with permissions to enable APIs and create log sinks, Pub/Sub topics, and pull subscriptions."},{kind:"prose",text:"Sazabi turns on the required APIs and sets up the log pipeline in your GCP project automatically."},{kind:"prose",text:"The service account needs the following roles on the target GCP project(s):"},{kind:"copyable-list",items:[{value:"roles/serviceusage.serviceUsageAdmin"},{value:"roles/logging.configWriter"},{value:"roles/pubsub.admin"},{value:"roles/browser"}]},{kind:"prose",text:'New or auto-created projects (for example a `gen-lang-client-...` project from Google AI Studio) may also need the Service Usage API enabled first. Sazabi uses that API to turn on the others, but it cannot enable itself. If you hit a "Service Usage API has not been used / is disabled" error, enable it on the project, wait about a minute, then retry.'},{kind:"prose",text:"To create the key: go to [Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts) in the Google Cloud Console, select (or create) the service account, open **Keys**, then choose **Add key → Create new key → JSON**. Download the file — you'll paste its contents in the next step. Alternatively, use `gcloud iam service-accounts keys create sazabi-key.json --iam-account=YOUR_SERVICE_ACCOUNT_EMAIL`."},{kind:"external-link",label:"Open service accounts in GCP Console",href:"https://console.cloud.google.com/iam-admin/serviceaccounts"},{kind:"external-link",label:"Enable the Service Usage API",href:"https://console.cloud.google.com/apis/library/serviceusage.googleapis.com"}]},{id:"credentials",title:"Enter service account key",description:"Enter the service account JSON so Sazabi can validate it.",steps:[{id:"key",kind:"secret",label:"Service account key (JSON)",instruction:"Paste your service account key JSON below.",placeholder:'{"type": "service_account", "project_id": "...", ...}'}]}],submit:{actions:[{kind:"validate",action:"validate",input:{serviceAccountKey:"$key"},resultAs:"validateKey"},{kind:"preflight",action:"preflight",input:{serviceAccountKey:"$key"}}],metadata:{serviceAccountKey:"$key",connectionMode:"managed"},displayName:"GCP $validateKey.projectId",button:Ee}}},{id:"connectionless",label:"Your own collector",description:"Configure the sink, Pub/Sub topic, and collector yourself.",flow:{kind:"connectionless"}}],docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/gcp"},Ev={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"displayName",header:"Name"},{field:"projectId",header:"Project ID",width:"w-48",cell:"muted"}],searchPlaceholder:"Search projects...",searchFields:["displayName","projectId"],dedupeByConfigField:"gcpProjectId",emptyState:{noMatches:"No projects found.",allConfigured:"All accessible projects already have log streams configured."},toStreamItem:{displayName:"$item.displayName",config:{gcpProjectId:"$item.projectId",gcpProjectName:"$item.displayName"}}}},Kv={groups:[{id:"prepare",section:"config",title:"Prepare GCP pipeline",description:"Create a Cloud Logging sink, Pub/Sub topic, and collector subscription.",steps:[{kind:"note",variant:"requirement",text:"Required GCP permissions: the person performing these steps needs a role that grants `logging.sinks.create` (e.g. `roles/logging.configWriter`) and `pubsub.topics.setIamPolicy` (e.g. `roles/pubsub.admin`)."},{kind:"note",text:"To forward Google Cloud Logging data to Sazabi, create a log sink that routes logs to a Pub/Sub topic, then deploy an OpenTelemetry Collector with a `googlecloudpubsub` receiver that subscribes to that topic and exports to Sazabi."},{kind:"ordered-steps",items:["Create a Pub/Sub topic and subscription in your GCP project (e.g. `sazabi-logs` and `sazabi-logs-sub`).","Create a Cloud Logging sink that routes logs to the Pub/Sub topic. Grant the sink's service account the `roles/pubsub.publisher` role on the topic.","Deploy an OpenTelemetry Collector (e.g. on a GCE instance, GKE pod, or Cloud Run service) using the `opentelemetry-collector-contrib` distribution.","Ensure the collector's service account has the `roles/pubsub.subscriber` IAM role on the subscription."]}]},{id:"values",section:"endpoint",title:"Copy Sazabi values",description:"Use these values in the collector exporter configuration.",steps:[{kind:"copyable",label:"`OTLP endpoint`",value:"https://${context.ingestHost}",copyLabel:"OTLP endpoint"}]},{id:"collector",section:"config",title:"Configure collector",description:"Use a `googlecloudpubsub` receiver and `otlp_http` exporter.",steps:[{kind:"note",variant:"requirement",text:"The receiver requires the `googlecloudlogentry_encoding` encoding extension."},{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`extensions:
|
|
7076
|
+
tls.verify on`}]}]},{id:"restart",section:"verify",title:"Restart and verify",description:"Restart Fluent Bit after changing the output configuration.",steps:[{kind:"prose",text:"Restart Fluent Bit so it picks up the updated output configuration, then trigger some log activity."},{kind:"note",text:"If logs do not appear after restart, check the Fluent Bit process logs for TLS, DNS, or authorization errors."}]}]}});var az;var cz=g(()=>{rz();az={id:"fluent_bit",name:"Fluent Bit",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward logs from your Kubernetes cluster or any infrastructure to Sazabi using the Fluent Bit agent.",features:["Kubernetes DaemonSet","Container log collection","Multi-pipeline routing","Low resource footprint"],evidenceHints:["fluent-bit.conf, parsers.conf, Helm values, or Kubernetes DaemonSets","Fluent Bit outputs already shipping container logs","README/docs naming Fluent Bit as the log forwarder"],setupSkill:H,dashboard:{iconKey:"fluent-bit",intakeSourceId:"fluent-bit"}}});var _v,jv,Rv;var sz=g(()=>{pt();_v={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a read-only Fly.io organization token.",steps:[{kind:"prose",text:"From the CLI: `flyctl tokens create readonly -o <org-slug>`."},{kind:"prose",text:"Or open the org's Tokens tab in the [Fly.io dashboard](https://fly.io/dashboard) and create a read-only token."}]},{id:"credentials",title:"Enter credentials",description:"Enter the token and organization slug Sazabi should use.",steps:[{id:"token",kind:"secret",label:"API token",instruction:"Enter your Fly.io API token below.",placeholder:"FlyV1 ..."},{id:"orgSlug",kind:"text",label:"Organization slug",instruction:"Enter your organization slug below.",placeholder:"personal"}]}],submit:{actions:[{kind:"validate",action:"validate",input:{dataSourceType:"fly_io",metadata:{apiToken:"$token",organizationSlug:"$orgSlug"}}}],metadata:{connectionMode:"managed",apiToken:"$token",organizationSlug:"$orgSlug"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/fly-io"},jv={groups:[{id:"shipper",section:"config",title:"Run a log shipper",description:"Fly.io has no managed log-drain API, so you run a log shipper inside your Fly organization and point it at Sazabi.",steps:[{kind:"note",text:"Fly forwards logs from its internal NATS log stream, so you deploy a shipper into the **same Fly organization** as the apps you want to monitor. The shipper is required either way — to also let Sazabi discover and verify your apps from a read-only token, connect your Fly.io account instead."},{kind:"prose",text:"Pick a log-shipper option — you run **one**, not both. **Option A — fly-log-shipper (simplest):** launch the stock [superfly/fly-log-shipper](https://github.com/superfly/fly-log-shipper) image in your org and enable its generic `http` sink with the two secrets below; Sazabi parses Fly's native JSON event format directly. **Option B — dedicated OTLP shipper:** for per-app keys and richer OTLP resource attributes, build a Vector app that wraps events in an OTLP `resourceLogs` envelope and POSTs to the OTLP endpoint below."}]},{id:"endpoint",section:"endpoint",title:"Set the shipper secrets",description:"Paste these into the fly-log-shipper app (Option A). The `/fly-log-shipper` path tells Sazabi to parse Fly's native event format.",steps:[{kind:"copyable",label:"`HTTP_URL`",value:"https://${context.ingestHost}/fly-log-shipper",description:"The `/fly-log-shipper` path suffix is required — it routes the payload to the Fly event parser."},{kind:"copyable",label:"`HTTP_TOKEN`",value:"${context.publicKey}",description:"Your Sazabi public key, sent as a bearer token. Paste the raw key with no `Bearer ` prefix."},{kind:"code",label:"Set both secrets on the shipper app",language:"bash",value:'fly secrets set -a <log-shipper-app> \\\n HTTP_URL="https://${context.ingestHost}/fly-log-shipper" \\\n HTTP_TOKEN="${context.publicKey}"'},{kind:"note",text:"**Option B (dedicated OTLP shipper)** uses the endpoint below instead of the two secrets above: POST OTLP `resourceLogs` here with the same public key as a bearer token. The full `Dockerfile` and `vector.toml` are in the setup guide."},{kind:"showIngestUrl",label:"OTLP endpoint (Option B)",pathSuffix:"/v1/logs",description:"POST OTLP `resourceLogs` here, with your Sazabi public key as a bearer token."}]},{id:"verify",section:"verify",title:"Deploy and verify",description:"Confirm logs arrive in Sazabi.",steps:[{kind:"prose",text:"Deploy the shipper, then trigger activity — deploy an app or hit a deployed route. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/fly-io"},Rv={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"}],searchPlaceholder:"Search apps...",searchFields:["name"],dedupeByConfigField:"appName",emptyState:{noMatches:"No apps found.",allConfigured:"All apps already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{appName:"$item.name"}}}}});var QQ,hz;var lz=g(()=>{sz();QQ=["apiToken"],hz={id:"fly_io",name:"Fly.io",searchAliases:["fly","flyio"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:QQ,subtitle:"Forward your Fly.io application logs directly to Sazabi for global monitoring.",features:["Log shipping","Multi-region logs","Machine monitoring"],evidenceHints:["fly.toml or .fly/ app configuration","FLY_* environment variables or scripts that run flyctl/fly deploy","README/docs naming Fly.io as the deployment host"],setupSkill:H,dashboard:{iconKey:"fly-io",intakeSourceId:"fly-io",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"dataSources.validateConnection"}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var Uv,Ev,Kv;var uz=g(()=>{pt();Uv={kind:"choice",title:"Choose setup method",description:"Select how you want to connect Google Cloud logs.",options:[{id:"service-account",label:"Service account",description:"Let Sazabi set up the log sink, Pub/Sub topic, and pull subscription automatically.",flow:{kind:"multi-step",steps:[{id:"prepare",title:"Prepare access",description:"Create a service account key with permissions for log forwarding.",steps:[{kind:"prose",text:"Provide a GCP service account key with permissions to enable APIs and create log sinks, Pub/Sub topics, and pull subscriptions."},{kind:"note",text:"Sazabi turns on the required APIs and sets up the log pipeline in your GCP project automatically."},{kind:"prose",text:"The service account needs the following roles on the target GCP project(s):"},{kind:"copyable-list",items:[{value:"roles/serviceusage.serviceUsageAdmin"},{value:"roles/logging.configWriter"},{value:"roles/pubsub.admin"},{value:"roles/browser"}]},{kind:"note",text:'New or auto-created projects (for example a `gen-lang-client-...` project from Google AI Studio) may also need the Service Usage API enabled first. Sazabi uses that API to turn on the others, but it cannot enable itself. If you hit a "Service Usage API has not been used / is disabled" error, enable it on the project, wait about a minute, then retry.'},{kind:"prose",text:"To create the key: go to [Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts) in the Google Cloud Console, select (or create) the service account, open **Keys**, then choose **Add key → Create new key → JSON**. Download the file — you'll paste its contents in the next step. Alternatively, use `gcloud iam service-accounts keys create sazabi-key.json --iam-account=YOUR_SERVICE_ACCOUNT_EMAIL`."},{kind:"external-link",label:"Open service accounts in GCP Console",href:"https://console.cloud.google.com/iam-admin/serviceaccounts"},{kind:"external-link",label:"Enable the Service Usage API",href:"https://console.cloud.google.com/apis/library/serviceusage.googleapis.com"}]},{id:"credentials",title:"Enter service account key",description:"Enter the service account JSON so Sazabi can validate it.",steps:[{id:"key",kind:"secret",label:"Service account key (JSON)",instruction:"Paste your service account key JSON below.",placeholder:'{"type": "service_account", "project_id": "...", ...}'}]}],submit:{actions:[{kind:"validate",action:"validate",input:{serviceAccountKey:"$key"},resultAs:"validateKey"},{kind:"preflight",action:"preflight",input:{serviceAccountKey:"$key"}}],metadata:{serviceAccountKey:"$key",connectionMode:"managed"},displayName:"GCP $validateKey.projectId",button:Ee}}},{id:"connectionless",label:"Your own collector",description:"Configure the sink, Pub/Sub topic, and collector yourself.",flow:{kind:"connectionless"}}],docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/gcp"},Ev={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"displayName",header:"Name"},{field:"projectId",header:"Project ID",width:"w-48",cell:"muted"}],searchPlaceholder:"Search projects...",searchFields:["displayName","projectId"],dedupeByConfigField:"gcpProjectId",emptyState:{noMatches:"No projects found.",allConfigured:"All accessible projects already have log streams configured."},toStreamItem:{displayName:"$item.displayName",config:{gcpProjectId:"$item.projectId",gcpProjectName:"$item.displayName"}}}},Kv={groups:[{id:"prepare",section:"config",title:"Prepare GCP pipeline",description:"Create a Cloud Logging sink, Pub/Sub topic, and collector subscription.",steps:[{kind:"note",variant:"requirement",text:"Required GCP permissions: the person performing these steps needs a role that grants `logging.sinks.create` (e.g. `roles/logging.configWriter`) and `pubsub.topics.setIamPolicy` (e.g. `roles/pubsub.admin`)."},{kind:"note",text:"To forward Google Cloud Logging data to Sazabi, create a log sink that routes logs to a Pub/Sub topic, then deploy an OpenTelemetry Collector with a `googlecloudpubsub` receiver that subscribes to that topic and exports to Sazabi."},{kind:"ordered-steps",items:["Create a Pub/Sub topic and subscription in your GCP project (e.g. `sazabi-logs` and `sazabi-logs-sub`).","Create a Cloud Logging sink that routes logs to the Pub/Sub topic. Grant the sink's service account the `roles/pubsub.publisher` role on the topic.","Deploy an OpenTelemetry Collector (e.g. on a GCE instance, GKE pod, or Cloud Run service) using the `opentelemetry-collector-contrib` distribution.","Ensure the collector's service account has the `roles/pubsub.subscriber` IAM role on the subscription."]}]},{id:"values",section:"endpoint",title:"Copy Sazabi values",description:"Use these values in the collector exporter configuration.",steps:[{kind:"copyable",label:"`OTLP endpoint`",value:"https://${context.ingestHost}",copyLabel:"OTLP endpoint"}]},{id:"collector",section:"config",title:"Configure collector",description:"Use a `googlecloudpubsub` receiver and `otlp_http` exporter.",steps:[{kind:"note",variant:"requirement",text:"The receiver requires the `googlecloudlogentry_encoding` encoding extension."},{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`extensions:
|
|
7077
7077
|
googlecloudlogentry_encoding:
|
|
7078
7078
|
|
|
7079
7079
|
receivers:
|
|
@@ -7381,7 +7381,7 @@ def _forward_to_sazabi(event, hint):
|
|
|
7381
7381
|
sentry_sdk.init(
|
|
7382
7382
|
dsn=SENTRY_DSN,
|
|
7383
7383
|
before_send=_forward_to_sazabi,
|
|
7384
|
-
)`,description:"Returning `event` keeps your primary Sentry project receiving it while the secondary client forwards a copy to Sazabi."}]},{id:"verify",title:"Verify telemetry",description:"Restart the app, send a test exception, and write a structured log.",steps:[{kind:"prose",text:"Turn on structured logging in the SDK first. This DSN also works with other official Sentry SDKs including Go, Ruby, Java, and .NET."}]}]}}]}});var pN;var mN=g(()=>{yN();pN={id:"sentry",name:"Sentry SDK",searchAliases:["sentry"],capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward Sentry SDK errors, structured logs, and envelope telemetry directly to Sazabi.",features:["Error forwarding","Structured logs","Envelope telemetry","SDK integration"],evidenceHints:["@sentry packages, sentry.properties, SENTRY_DSN, or sentry-cli releases","Sentry.init calls or framework-specific Sentry config files","README/docs naming Sentry as the error tracking provider"],setupSkill:H,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-dsn"}}});var uk,gk;var wN=g(()=>{pt();uk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Sentry user auth token with org write access.",steps:[{kind:"prose",text:"You must be an **Owner** or **Manager** in the Sentry organization — creating an Internal Integration needs the `org:write` scope, which Admin, Member, and Billing roles do not have (Sentry returns 403)."},{kind:"prose",text:"Create a Sentry user auth token with **Organization: Read & Write** (`org:write`), **Project: Read**, and **Issue & Event: Read**. The `org:write` scope only lets Sazabi create the Internal Integration; the integration itself only receives read-level webhook events."},{kind:"prose",text:"Confirm the Permissions Preview at the bottom of the Sentry form shows `event:read, org:write, project:read` before submitting."},{kind:"external-link",label:"Open Sentry auth token settings",href:"https://sentry.io/settings/account/api/auth-tokens/new-token/"}]},{id:"credentials",title:"Enter credentials",description:"Enter the auth token and organization slug, then Sazabi validates them.",steps:[{id:"token",kind:"secret",label:"Sentry auth token",instruction:"Enter your Sentry auth token below.",description:"A token with the org:write, project:read, and event:read scopes.",placeholder:"Enter your Sentry auth token"},{id:"organizationSlug",kind:"text",label:"Sentry organization slug",instruction:"Enter your Sentry organization slug below.",description:"The slug from your Sentry URL: sentry.io/organizations/<slug>/",placeholder:"e.g. my-org",pattern:"^[a-z0-9][a-z0-9-]*[a-z0-9]$",patternMessage:"Enter a valid Sentry organization slug (lowercase, hyphens allowed)."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token",organizationSlug:"$organizationSlug"},resultAs:"validate"}],metadata:{connectionMode:"managed",sentryAuthToken:"$token",organizationSlug:"$organizationSlug"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/sentry"},gk={groups:[{id:"create-integration",section:"config",title:"Create the Internal Integration",description:"Create a Sentry Internal Integration in your organization's developer settings.",steps:[{kind:"note",variant:"requirement",text:"Creating an Internal Integration needs the **`org:write`** scope, which Sentry grants only to organization **Owners** and **Managers**. On this path the scope never leaves Sentry — you give Sazabi no auth token."},{kind:"prose",text:"In Sentry, go to **Settings → Developer Settings → Custom Integrations** and choose **New Internal Integration**."},{kind:"external-link",label:"Open Sentry Custom Integrations",href:"https://sentry.io/settings/developer-settings/"},{kind:"prose",text:"Under **Webhooks**, enable webhooks and subscribe to the **Issue** and **Comment** resources. To route alerts as well, enable **Alert Rule Action** so the integration can be added as a notification destination on Issue Alert and Metric Alert rules."}]},{id:"endpoint",section:"endpoint",title:"Set the webhook URL",description:"Paste this URL into the Internal Integration's Webhook URL field.",steps:[{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}"},{kind:"note",text:"Your key sits inside the hostname, so the webhook needs no custom headers."},{kind:"prose",text:"Save the integration."}]},{id:"verify",section:"verify",title:"Verify",description:"Confirm events arrive in Sazabi.",steps:[{kind:"prose",text:"Do something in Sentry to trigger an event — comment on an issue, change an issue's status, or create a fresh issue by throwing an exception in an instrumented project. `issue` and `comment` webhooks arrive within a few minutes."},{kind:"prose",text:"**Alerts are opt-in.** To stream `event_alert` / `metric_alert` webhooks, edit each Issue Alert or Metric Alert rule in Sentry and add this integration as a notification destination."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/sentry-platform"}});var a9,vN;var kN=g(()=>{wN();a9=["sentryAuthToken"],vN={id:"sentry_platform",name:"Sentry",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],streamCardinality:"single",sensitiveFields:a9,subtitle:"Connect your Sentry organization to stream errors, issues, and alerts to Sazabi in real-time.",features:["Error streaming","Issue tracking","Alert forwarding","Metric alerts"],evidenceHints:["Sentry organization or project config where org-level event forwarding is preferred","sentry-cli release/deploy automation that would benefit from platform context","Multiple Sentry SDK projects that should be connected through one Sentry platform integration"],setupSkill:H,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-platform",actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["token"]}}}}}});var dk;var fN=g(()=>{dk={groups:[{id:"open-form",section:"config",title:"Open log drain form",description:"Create an OTLP log drain in the Supabase project settings.",steps:[{kind:"note",variant:"requirement",text:"Log Drains require a Supabase Pro, Team, or Enterprise plan."},{kind:"prose",text:"In the [Supabase dashboard](https://supabase.com/dashboard), open the project whose logs you want to forward, then open **Project Settings > Log Drains** and click **Add destination**."}]},{id:"fields",section:"config",title:"Copy drain fields",description:"Fill in these fields in order. Each one matches a field in the Supabase form.",steps:[{kind:"copyable",label:"Name",value:"Sazabi"},{kind:"copyable",label:"Description",value:"Forward Supabase logs to Sazabi for observability and AI analysis."},{kind:"prose",text:"Set **Type** to **OpenTelemetry Protocol (OTLP)**."}]},{id:"otlp-endpoint",section:"endpoint",title:"OTLP Endpoint",description:"Paste your Sazabi intake URL (above) into the **OTLP Endpoint** field.",steps:[{kind:"copyable",label:"OTLP Endpoint",value:"https://${context.ingestHost}/v1/logs"}]},{id:"delivery-fields",section:"config",title:"Finish drain fields",description:"Complete the remaining fields in the Supabase form.",steps:[{kind:"copyable",label:"Protocol",value:"HTTP/Protobuf"},{kind:"prose",text:"Set **Gzip Compression** to **Enabled**."}]},{id:"save",section:"verify",title:"Save and verify",description:"Save the drain and generate fresh Supabase logs.",steps:[{kind:"prose",text:"Save the log drain, then trigger activity — run a query or hit your project's API. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/supabase"}});var IN;var ON=g(()=>{fN();IN={id:"supabase",name:"Supabase",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",subtitle:"Stream your Supabase project logs directly to Sazabi for unified observability.",features:["Database logs","Auth events","Edge Function logs"],evidenceHints:["supabase/ directory, supabase/config.toml, or Supabase CLI scripts","@supabase/* packages, SUPABASE_URL, or SUPABASE_SERVICE_ROLE_KEY","README/docs naming Supabase for Postgres, Auth, Storage, or Edge Functions"],setupSkill:H,dashboard:{iconKey:"supabase",intakeSourceId:"supabase"}}});var bk;var PN=g(()=>{pt();bk={groups:[{id:"instrument",section:"config",title:"Instrument workers",description:"Set up each Temporal worker runtime to send OpenTelemetry data.",steps:[{kind:"ordered-steps",items:zh("Temporal worker")}]},{id:"environment",section:"endpoint",title:"Copy OTLP environment",description:"Set these variables where your Temporal workers run.",steps:[Nh,..._o()]},{id:"redeploy",section:"verify",title:"Redeploy and verify",description:"Restart your workers so the OpenTelemetry SDK picks up the new variables.",steps:[{kind:"prose",text:"Redeploy or restart your Temporal workers, then run a workflow or activity to generate fresh telemetry."}]}]}});var SN;var $N=g(()=>{PN();SN={id:"temporal",name:"Temporal",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual worker setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward OpenTelemetry logs and traces from your Temporal workers to Sazabi for durable execution observability.",features:["Worker logs","Workflow and activity traces"],evidenceHints:["@temporalio packages, Temporal worker entrypoints, workflows/, or activities/","TEMPORAL_ADDRESS, TEMPORAL_NAMESPACE, or Temporal Cloud deployment docs","Background workflows or durable orchestration code that already emits OTLP telemetry"],setupSkill:H,dashboard:{iconKey:"temporal",intakeSourceId:"temporal"}}});var yk;var TN=g(()=>{yk={perStreamInstructions:!0,groups:[{id:"prepare",section:"config",title:"Prepare Trigger.dev project",description:"Install the OTLP logs exporter and decide where to set it up.",steps:[{kind:"ordered-steps",items:["Install `@opentelemetry/exporter-logs-otlp-http` in the package that owns your `trigger.config.ts` file.","Set `telemetry.logExporters` directly in `trigger.config.ts`. Trigger.dev reserves `OTEL_*` environment variables for its own internal telemetry, so do not use them for this integration.","If your project already sets up OpenTelemetry in code, reuse the Sazabi log intake URL in that setup instead of adding a second exporter."]}]},{id:"values",section:"endpoint",title:"Copy Sazabi values",description:"Use this keyed intake URL in your Trigger.dev config.",steps:[{kind:"copyable",label:"Sazabi log intake URL",value:"https://${context.ingestHost}/v1/logs",copyLabel:"Sazabi log intake URL"}]},{id:"configure",section:"config",title:"Configure log exporter",description:"Add the OTLP log exporter to `trigger.config.ts`.",steps:[{kind:"code",label:"`trigger.config.ts`",language:"typescript",value:`import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
|
|
7384
|
+
)`,description:"Returning `event` keeps your primary Sentry project receiving it while the secondary client forwards a copy to Sazabi."}]},{id:"verify",title:"Verify telemetry",description:"Restart the app, send a test exception, and write a structured log.",steps:[{kind:"prose",text:"Turn on structured logging in the SDK first. This DSN also works with other official Sentry SDKs including Go, Ruby, Java, and .NET."}]}]}}]}});var pN;var mN=g(()=>{yN();pN={id:"sentry",name:"Sentry SDK",searchAliases:["sentry"],capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual SDK setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward Sentry SDK errors, structured logs, and envelope telemetry directly to Sazabi.",features:["Error forwarding","Structured logs","Envelope telemetry","SDK integration"],evidenceHints:["@sentry packages, sentry.properties, SENTRY_DSN, or sentry-cli releases","Sentry.init calls or framework-specific Sentry config files","README/docs naming Sentry as the error tracking provider"],setupSkill:H,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-dsn"}}});var uk,gk;var wN=g(()=>{pt();uk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",description:"Create a Sentry user auth token with org write access.",steps:[{kind:"note",variant:"requirement",text:"You must be an **Owner** or **Manager** in the Sentry organization — creating an Internal Integration needs the `org:write` scope, which Admin, Member, and Billing roles do not have (Sentry returns 403)."},{kind:"prose",text:"Create a Sentry user auth token with **Organization: Read & Write** (`org:write`), **Project: Read**, and **Issue & Event: Read**. The `org:write` scope only lets Sazabi create the Internal Integration; the integration itself only receives read-level webhook events."},{kind:"prose",text:"Confirm the Permissions Preview at the bottom of the Sentry form shows `event:read, org:write, project:read` before submitting."},{kind:"external-link",label:"Open Sentry auth token settings",href:"https://sentry.io/settings/account/api/auth-tokens/new-token/"}]},{id:"credentials",title:"Enter credentials",description:"Enter the auth token and organization slug, then Sazabi validates them.",steps:[{id:"token",kind:"secret",label:"Sentry auth token",instruction:"Enter your Sentry auth token below.",description:"A token with the org:write, project:read, and event:read scopes.",placeholder:"Enter your Sentry auth token"},{id:"organizationSlug",kind:"text",label:"Sentry organization slug",instruction:"Enter your Sentry organization slug below.",description:"The slug from your Sentry URL: sentry.io/organizations/<slug>/",placeholder:"e.g. my-org",pattern:"^[a-z0-9][a-z0-9-]*[a-z0-9]$",patternMessage:"Enter a valid Sentry organization slug (lowercase, hyphens allowed)."}]}],submit:{actions:[{kind:"validate",action:"validate",input:{token:"$token",organizationSlug:"$organizationSlug"},resultAs:"validate"}],metadata:{connectionMode:"managed",sentryAuthToken:"$token",organizationSlug:"$organizationSlug"},button:Ee},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/sentry"},gk={groups:[{id:"create-integration",section:"config",title:"Create the Internal Integration",description:"Create a Sentry Internal Integration in your organization's developer settings.",steps:[{kind:"note",variant:"requirement",text:"Creating an Internal Integration needs the **`org:write`** scope, which Sentry grants only to organization **Owners** and **Managers**. On this path the scope never leaves Sentry — you give Sazabi no auth token."},{kind:"prose",text:"In Sentry, go to **Settings → Developer Settings → Custom Integrations** and choose **New Internal Integration**."},{kind:"external-link",label:"Open Sentry Custom Integrations",href:"https://sentry.io/settings/developer-settings/"},{kind:"prose",text:"Under **Webhooks**, enable webhooks and subscribe to the **Issue** and **Comment** resources. To route alerts as well, enable **Alert Rule Action** so the integration can be added as a notification destination on Issue Alert and Metric Alert rules."}]},{id:"endpoint",section:"endpoint",title:"Set the webhook URL",description:"Paste this URL into the Internal Integration's Webhook URL field.",steps:[{kind:"copyable",label:"Webhook URL",value:"https://${context.ingestHost}"},{kind:"note",text:"Your key sits inside the hostname, so the webhook needs no custom headers."},{kind:"prose",text:"Save the integration."}]},{id:"verify",section:"verify",title:"Verify",description:"Confirm events arrive in Sazabi.",steps:[{kind:"prose",text:"Do something in Sentry to trigger an event — comment on an issue, change an issue's status, or create a fresh issue by throwing an exception in an instrumented project. `issue` and `comment` webhooks arrive within a few minutes."},{kind:"prose",text:"**Alerts are opt-in.** To stream `event_alert` / `metric_alert` webhooks, edit each Issue Alert or Metric Alert rule in Sentry and add this integration as a notification destination."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/sentry-platform"}});var a9,vN;var kN=g(()=>{wN();a9=["sentryAuthToken"],vN={id:"sentry_platform",name:"Sentry",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],streamCardinality:"single",sensitiveFields:a9,subtitle:"Connect your Sentry organization to stream errors, issues, and alerts to Sazabi in real-time.",features:["Error streaming","Issue tracking","Alert forwarding","Metric alerts"],evidenceHints:["Sentry organization or project config where org-level event forwarding is preferred","sentry-cli release/deploy automation that would benefit from platform context","Multiple Sentry SDK projects that should be connected through one Sentry platform integration"],setupSkill:H,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-platform",actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["token"]}}}}}});var dk;var fN=g(()=>{dk={groups:[{id:"open-form",section:"config",title:"Open log drain form",description:"Create an OTLP log drain in the Supabase project settings.",steps:[{kind:"note",variant:"requirement",text:"Log Drains require a Supabase Pro, Team, or Enterprise plan."},{kind:"prose",text:"In the [Supabase dashboard](https://supabase.com/dashboard), open the project whose logs you want to forward, then open **Project Settings > Log Drains** and click **Add destination**."}]},{id:"fields",section:"config",title:"Copy drain fields",description:"Fill in these fields in order. Each one matches a field in the Supabase form.",steps:[{kind:"copyable",label:"Name",value:"Sazabi"},{kind:"copyable",label:"Description",value:"Forward Supabase logs to Sazabi for observability and AI analysis."},{kind:"prose",text:"Set **Type** to **OpenTelemetry Protocol (OTLP)**."}]},{id:"otlp-endpoint",section:"endpoint",title:"OTLP Endpoint",description:"Paste your Sazabi intake URL (above) into the **OTLP Endpoint** field.",steps:[{kind:"copyable",label:"OTLP Endpoint",value:"https://${context.ingestHost}/v1/logs"}]},{id:"delivery-fields",section:"config",title:"Finish drain fields",description:"Complete the remaining fields in the Supabase form.",steps:[{kind:"copyable",label:"Protocol",value:"HTTP/Protobuf"},{kind:"prose",text:"Set **Gzip Compression** to **Enabled**."}]},{id:"save",section:"verify",title:"Save and verify",description:"Save the drain and generate fresh Supabase logs.",steps:[{kind:"prose",text:"Save the log drain, then trigger activity — run a query or hit your project's API. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/supabase"}});var IN;var ON=g(()=>{fN();IN={id:"supabase",name:"Supabase",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual drain setup is not exercised by automated lifecycle tests yet.",subtitle:"Stream your Supabase project logs directly to Sazabi for unified observability.",features:["Database logs","Auth events","Edge Function logs"],evidenceHints:["supabase/ directory, supabase/config.toml, or Supabase CLI scripts","@supabase/* packages, SUPABASE_URL, or SUPABASE_SERVICE_ROLE_KEY","README/docs naming Supabase for Postgres, Auth, Storage, or Edge Functions"],setupSkill:H,dashboard:{iconKey:"supabase",intakeSourceId:"supabase"}}});var bk;var PN=g(()=>{pt();bk={groups:[{id:"instrument",section:"config",title:"Instrument workers",description:"Set up each Temporal worker runtime to send OpenTelemetry data.",steps:[{kind:"ordered-steps",items:zh("Temporal worker")}]},{id:"environment",section:"endpoint",title:"Copy OTLP environment",description:"Set these variables where your Temporal workers run.",steps:[Nh,..._o()]},{id:"redeploy",section:"verify",title:"Redeploy and verify",description:"Restart your workers so the OpenTelemetry SDK picks up the new variables.",steps:[{kind:"prose",text:"Redeploy or restart your Temporal workers, then run a workflow or activity to generate fresh telemetry."}]}]}});var SN;var $N=g(()=>{PN();SN={id:"temporal",name:"Temporal",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual worker setup is not exercised by automated lifecycle tests yet.",subtitle:"Forward OpenTelemetry logs and traces from your Temporal workers to Sazabi for durable execution observability.",features:["Worker logs","Workflow and activity traces"],evidenceHints:["@temporalio packages, Temporal worker entrypoints, workflows/, or activities/","TEMPORAL_ADDRESS, TEMPORAL_NAMESPACE, or Temporal Cloud deployment docs","Background workflows or durable orchestration code that already emits OTLP telemetry"],setupSkill:H,dashboard:{iconKey:"temporal",intakeSourceId:"temporal"}}});var yk;var TN=g(()=>{yk={perStreamInstructions:!0,groups:[{id:"prepare",section:"config",title:"Prepare Trigger.dev project",description:"Install the OTLP logs exporter and decide where to set it up.",steps:[{kind:"ordered-steps",items:["Install `@opentelemetry/exporter-logs-otlp-http` in the package that owns your `trigger.config.ts` file.","Set `telemetry.logExporters` directly in `trigger.config.ts`. Trigger.dev reserves `OTEL_*` environment variables for its own internal telemetry, so do not use them for this integration.","If your project already sets up OpenTelemetry in code, reuse the Sazabi log intake URL in that setup instead of adding a second exporter."]}]},{id:"values",section:"endpoint",title:"Copy Sazabi values",description:"Use this keyed intake URL in your Trigger.dev config.",steps:[{kind:"copyable",label:"Sazabi log intake URL",value:"https://${context.ingestHost}/v1/logs",copyLabel:"Sazabi log intake URL"}]},{id:"configure",section:"config",title:"Configure log exporter",description:"Add the OTLP log exporter to `trigger.config.ts`.",steps:[{kind:"code",label:"`trigger.config.ts`",language:"typescript",value:`import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
|
|
7385
7385
|
import { defineConfig } from "@trigger.dev/sdk";
|
|
7386
7386
|
|
|
7387
7387
|
export default defineConfig({
|