@sazabi/cli 0.19.0-dev.gbab75df → 0.19.0-dev.gd473e57
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
|
@@ -6778,7 +6778,7 @@ log_user_prompt = true
|
|
|
6778
6778
|
|
|
6779
6779
|
[otel.exporter.otlp-http]
|
|
6780
6780
|
endpoint = "https://\${context.ingestHost}/v1/logs"
|
|
6781
|
-
protocol = "binary"`}],notes:[{text:"`log_user_prompt = true` exports raw prompt text (including anything you paste). Set it to `false` to keep prompts private while still tracking tool calls and API usage.",variant:"requirement"},{text:"Codex requires the full logs URL in `endpoint` — it does not append the `/v1/logs` path itself."},{text:"Codex metrics are not ingested yet — leave `metrics_exporter` at its default; pointing it at Sazabi only ships traffic that intake discards."}]}]},{id:"restart",section:"verify",title:"Restart Codex",actions:[{instruction:"Configuration loads at startup — telemetry begins with your next Codex session, not the current one. Restart Codex now."}]}]}});var YN;var QN=g(()=>{FN();YN={id:"codex",name:"Codex",searchAliases:["openai","codex-cli","openai codex","coding agent"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"codex",label:"Codex",transform:"otlp-passthrough"}],lifecycleSkipReason:"Manual Codex config.toml setup is not exercised by automated lifecycle tests yet.",subtitle:"Ship Codex CLI session telemetry — prompts, tool calls, and model API requests — to Sazabi via Codex's built-in OTLP exporter.",features:["Prompt and tool-call events","Model API request metadata","Session and user attribution","No code changes required"],evidenceHints:["~/.codex/config.toml or .codex/ project configuration","Codex CLI installed and in active use","AGENTS.md files authored for Codex"],setupSkill:B,dashboard:{slug:"codex",iconKey:"codex",intakeSourceId:"codex"}}});var sk,lk,hk;var VN=g(()=>{Pt();sk={kind:"multi-step",steps:[{id:"credentials",title:"Enter access token",actions:[{kind:"instruction",instruction:"Create a team access token in your [Convex dashboard team settings](https://dashboard.convex.dev)."},{id:"token",kind:"secret",label:"Team access token",instruction:"Enter your team access token below.",placeholder:"eyJ..."}]},{id:"team",title:"Choose team",actions:[{id:"team",kind:"select",label:"Team",instruction:"Select the Convex team whose deployments Sazabi should list.",placeholder:"Select a team",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"slug"}]}],submit:{metadata:{accessToken:"$token",teamId:"$team.id",teamName:"$team.name"},displayName:"$team.name",button:Me}},lk={groups:[{id:"open-log-streams",section:"config",title:"Open Log Streams",notes:[{variant:"requirement",text:"**Convex log streams require the Pro plan.** Free/Starter teams cannot configure log streams."}],actions:[{instruction:"In your [Convex dashboard](https://dashboard.convex.dev), open the deployment you want to forward, then go to **Settings > Integrations** and configure a **Webhook** log stream.",notes:[{text:"Log streams are **per deployment** — repeat this setup for each deployment you want to forward. To onboard many deployments at once, connect your Convex account instead and Sazabi creates the log streams for you."}]}]},{id:"endpoint",section:"config",title:"Set webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the webhook configuration."}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log stream, then trigger activity — run a Convex function or hit a deployed endpoint. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/convex"},hk={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"},{field:"slug",header:"Slug",width:"w-48",cell:"muted"}],searchPlaceholder:"Search deployments...",searchFields:["name"],dedupeByConfigField:"deploymentId",emptyState:{noMatches:"No deployments found.",allConfigured:"All deployments already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{deploymentId:"$item.id",deploymentName:"$item.name"}}}}});var i7,a7,e1;var t1=g(()=>{VN();i7=["accessToken"],a7={id:"convex",label:"Convex",transform:"convex-webhook"},e1={id:"convex",name:"Convex",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:i7,serverOwnedStreamConfigFields:["logStreamId"],secretStreamConfigFields:["deployKey"],intake:[a7],subtitle:"Forward your Convex deployment logs directly to Sazabi for serverless observability.",features:["Function logs","Database mutations","Scheduled job monitoring"],evidenceHints:["convex/ directory, convex.json, or convex package imports","CONVEX_* or NEXT_PUBLIC_CONVEX_URL environment variables","README/docs naming Convex for serverless functions or database state"],setupSkill:B,dashboard:{iconKey:"convex",intakeSourceId:"convex",streamSelectorLayout:"sidepanel",actions:{list:{options:{procedure:"convex.listTeams",itemsField:"teams",sensitiveInputFields:["token"]},list:{procedure:"convex.listDeployments",itemsField:"deployments",sensitiveInputFields:["token"]}}}}}});var uk;var n1=g(()=>{uk={perStreamInstructions:!0,groups:[{id:"configure",section:"config",title:"Configure the Datadog Agent",actions:[{instruction:"Choose how this Datadog Agent should ship logs to Sazabi, then apply the matching configuration.",payloads:[{kind:"options",options:[{id:"datadog-yaml-dual-ship",label:"`datadog.yaml` dual-ship",description:"Keep the Agent's Datadog API key and add Sazabi as an additional logs endpoint.",payloads:[{kind:"copyable",label:"Intake host",value:"${context.ingestHost}",copyLabel:"Datadog intake host",description:"Use this host in `logs_config.additional_endpoints`."},{kind:"code",language:"yaml",copyLabel:"datadog.yaml dual-ship configuration",value:`# Enable logs collection if it is not already enabled.
|
|
6781
|
+
protocol = "binary"`}],notes:[{text:"`log_user_prompt = true` exports raw prompt text (including anything you paste). Set it to `false` to keep prompts private while still tracking tool calls and API usage.",variant:"requirement"},{text:"Codex requires the full logs URL in `endpoint` — it does not append the `/v1/logs` path itself."},{text:"Codex metrics are not ingested yet — leave `metrics_exporter` at its default; pointing it at Sazabi only ships traffic that intake discards."}]}]},{id:"restart",section:"verify",title:"Restart Codex",actions:[{instruction:"Configuration loads at startup — telemetry begins with your next Codex session, not the current one. Restart Codex now."}]}]}});var YN;var QN=g(()=>{FN();YN={id:"codex",name:"Codex",searchAliases:["openai","codex-cli","openai codex","coding agent"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"codex",label:"Codex",transform:"otlp-passthrough"}],lifecycleSkipReason:"Manual Codex config.toml setup is not exercised by automated lifecycle tests yet.",subtitle:"Ship Codex CLI session telemetry — prompts, tool calls, and model API requests — to Sazabi via Codex's built-in OTLP exporter.",features:["Prompt and tool-call events","Model API request metadata","Session and user attribution","No code changes required"],evidenceHints:["~/.codex/config.toml or .codex/ project configuration","Codex CLI installed and in active use","AGENTS.md files authored for Codex"],setupSkill:B,dashboard:{slug:"codex",iconKey:"codex",intakeSourceId:"codex"}}});var sk,lk,hk;var VN=g(()=>{Pt();sk={kind:"multi-step",steps:[{id:"credentials",title:"Enter access token",actions:[{kind:"instruction",instruction:"Create a team access token in your [Convex dashboard team settings](https://dashboard.convex.dev)."},{id:"token",kind:"secret",label:"Team access token",instruction:"Enter your team access token below.",placeholder:"eyJ..."}]},{id:"team",title:"Choose team",actions:[{id:"team",kind:"select",label:"Team",instruction:"Select the Convex team whose deployments Sazabi should list.",placeholder:"Select a team",optionsAction:"options",optionsInput:{token:"$token"},optionValueField:"id",optionLabelField:"name",optionDescriptionField:"slug"}]}],submit:{metadata:{accessToken:"$token",teamId:"$team.id",teamName:"$team.name"},displayName:"$team.name",button:Me}},lk={groups:[{id:"open-log-streams",section:"config",title:"Open Log Streams",notes:[{variant:"requirement",text:"**Convex log streams require the Pro plan.** Free/Starter teams cannot configure log streams."}],actions:[{instruction:"In your [Convex dashboard](https://dashboard.convex.dev), open the deployment you want to forward, then go to **Settings > Integrations** and configure a **Webhook** log stream.",notes:[{text:"Log streams are **per deployment** — repeat this setup for each deployment you want to forward. To onboard many deployments at once, connect your Convex account instead and Sazabi creates the log streams for you."}]}]},{id:"endpoint",section:"config",title:"Set webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the webhook configuration."}]},{id:"verify",section:"verify",title:"Save and verify",actions:[{instruction:"Save the log stream, then trigger activity — run a Convex function or hit a deployed endpoint. Logs appear in Sazabi within a few minutes."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/convex"},hk={content:{kind:"list",listAction:"list",listInput:{connectionId:"${context.connectionId}"},columns:[{field:"name",header:"Name"},{field:"slug",header:"Slug",width:"w-48",cell:"muted"}],searchPlaceholder:"Search deployments...",searchFields:["name"],dedupeByConfigField:"deploymentId",emptyState:{noMatches:"No deployments found.",allConfigured:"All deployments already have log streams configured."},toStreamItem:{displayName:"$item.name",config:{deploymentId:"$item.id",deploymentName:"$item.name"}}}}});var i7,a7,e1;var t1=g(()=>{VN();i7=["accessToken"],a7={id:"convex",label:"Convex",transform:"convex-webhook"},e1={id:"convex",name:"Convex",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:i7,serverOwnedStreamConfigFields:["logStreamId"],secretStreamConfigFields:["deployKey"],intake:[a7],subtitle:"Forward your Convex deployment logs directly to Sazabi for serverless observability.",features:["Function logs","Database mutations","Scheduled job monitoring"],evidenceHints:["convex/ directory, convex.json, or convex package imports","CONVEX_* or NEXT_PUBLIC_CONVEX_URL environment variables","README/docs naming Convex for serverless functions or database state"],setupSkill:B,dashboard:{iconKey:"convex",intakeSourceId:"convex",streamSelectorLayout:"sidepanel",actions:{list:{options:{procedure:"convex.listTeams",itemsField:"teams",sensitiveInputFields:["token"]},list:{procedure:"convex.listDeployments",itemsField:"deployments",sensitiveInputFields:["token"]}}}}}});var uk;var n1=g(()=>{uk={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/datadog",perStreamInstructions:!0,groups:[{id:"configure",section:"config",title:"Configure the Datadog Agent",actions:[{instruction:"Choose how this Datadog Agent should ship logs to Sazabi, then apply the matching configuration.",payloads:[{kind:"options",options:[{id:"datadog-yaml-dual-ship",label:"`datadog.yaml` dual-ship",description:"Keep the Agent's Datadog API key and add Sazabi as an additional logs endpoint.",payloads:[{kind:"copyable",label:"Intake host",value:"${context.ingestHost}",copyLabel:"Datadog intake host",description:"Use this host in `logs_config.additional_endpoints`."},{kind:"code",language:"yaml",copyLabel:"datadog.yaml dual-ship configuration",value:`# Enable logs collection if it is not already enabled.
|
|
6782
6782
|
logs_enabled: true
|
|
6783
6783
|
|
|
6784
6784
|
# Send a copy of logs to Sazabi while the primary Agent config
|
|
@@ -7010,7 +7010,7 @@ output {
|
|
|
7010
7010
|
port 443
|
|
7011
7011
|
logs_uri /v1/logs
|
|
7012
7012
|
tls on
|
|
7013
|
-
tls.verify on`}]}]}]},{id:"restart",section:"verify",title:"Restart and verify",actions:[{instruction:"Restart Fluent Bit so it picks up the updated output configuration, then trigger some log activity.",notes:[{text:"If logs do not appear after restart, check the Fluent Bit process logs for TLS, DNS, or authorization errors."}]}]}]}});var w1;var v1=g(()=>{p1();w1={id:"fluent_bit",name:"Fluent Bit",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",intake:[{id:"fluent-bit",label:"Fluent Bit",transform:"otlp-passthrough"}],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:B,dashboard:{iconKey:"fluent-bit",intakeSourceId:"fluent-bit"}}});var vk,fk,kk;var f1=g(()=>{Pt();vk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",actions:[{kind:"instruction",instruction:"Create a read-only organization token from the CLI or the Fly.io dashboard.",payloads:[{kind:"options",options:[{id:"cli",label:"CLI",payloads:[{kind:"code",language:"bash",copyLabel:"flyctl read-only token command",value:"flyctl tokens create readonly -o <org-slug>"}]},{id:"dashboard",label:"Dashboard",payloads:[{kind:"external-link",label:"Open the Fly.io dashboard",href:"https://fly.io/dashboard",description:"Open the org's Tokens tab and create a read-only token."}]}]}]}]},{id:"credentials",title:"Enter credentials",actions:[{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:{provider:"fly_io",metadata:{apiToken:"$token",organizationSlug:"$orgSlug"}}}],metadata:{apiToken:"$token",organizationSlug:"$orgSlug"},button:Me},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/fly-io"},fk={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.",notes:[{text:"The shipper reads Fly's internal NATS log stream, so it must run in 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."}],actions:[{instruction:"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:"config",title:"Set the shipper secrets",actions:[{instruction:"Set the fly-log-shipper secrets (Option A): `HTTP_URL` is your intake URL (above); `HTTP_TOKEN` is the key below.",payloads:[{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}"'}]},{instruction:"If you chose the dedicated OTLP shipper (Option B), POST OTLP `resourceLogs` to the endpoint below — with the same public key as a bearer token — instead of setting the two secrets above.",payloads:[{kind:"showIngestUrl",label:"OTLP endpoint (Option B)",pathSuffix:"/v1/logs"}]}]},{id:"verify",section:"verify",title:"Deploy and verify",actions:[{instruction:"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"},kk={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 h7,u7,k1;var S1=g(()=>{f1();h7=["apiToken"],u7={id:"fly-io",label:"Fly.io",transform:"otlp-with-fly-log-shipper"},k1={id:"fly_io",name:"Fly.io",searchAliases:["fly","flyio"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:h7,serverOwnedStreamConfigFields:["webhookUrl"],intake:[u7],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:B,dashboard:{iconKey:"fly-io",intakeSourceId:"fly-io",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"logSources.validateConnection"}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var Sk,Pk,$k;var P1=g(()=>{Pt();Sk={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.",notes:[{text:"Sazabi turns on the required APIs and sets up the log pipeline in your GCP project automatically."}],actions:[{kind:"instruction",instruction:"Grant the service account the following roles on the target GCP project(s).",payloads:[{kind:"copyable-list",items:[{value:"roles/serviceusage.serviceUsageAdmin"},{value:"roles/logging.configWriter"},{value:"roles/pubsub.admin"},{value:"roles/browser"}]},{kind:"external-link",label:"Enable the Service Usage API",href:"https://console.cloud.google.com/apis/library/serviceusage.googleapis.com"}],notes:[{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:"instruction",instruction:"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`.",payloads:[{kind:"external-link",label:"Open service accounts in GCP Console",href:"https://console.cloud.google.com/iam-admin/serviceaccounts"}]}]},{id:"credentials",title:"Enter service account key",actions:[{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"},displayName:"GCP $validateKey.projectId",button:Me}}},{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"},Pk={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"}}}},$k={groups:[{id:"prepare",section:"config",title:"Prepare GCP pipeline",description:"Create a Cloud Logging sink, Pub/Sub topic, and collector subscription.",notes:[{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`)."}],actions:[{instruction:"Create a Pub/Sub topic and subscription in your GCP project (e.g. `sazabi-logs` and `sazabi-logs-sub`)."},{instruction:"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."},{instruction:"Deploy an OpenTelemetry Collector (e.g. on a GCE instance, GKE pod, or Cloud Run service) using the `opentelemetry-collector-contrib` distribution."},{instruction:"Ensure the collector's service account has the `roles/pubsub.subscriber` IAM role on the subscription."}]},{id:"collector",section:"config",title:"Configure collector",notes:[{variant:"requirement",text:"The receiver requires the `googlecloudlogentry_encoding` encoding extension."}],actions:[{instruction:"Use a `googlecloudpubsub` receiver and `otlp_http` exporter.",payloads:[{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`extensions:
|
|
7013
|
+
tls.verify on`}]}]}]},{id:"restart",section:"verify",title:"Restart and verify",actions:[{instruction:"Restart Fluent Bit so it picks up the updated output configuration, then trigger some log activity.",notes:[{text:"If logs do not appear after restart, check the Fluent Bit process logs for TLS, DNS, or authorization errors."}]}]}]}});var w1;var v1=g(()=>{p1();w1={id:"fluent_bit",name:"Fluent Bit",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual agent setup is not exercised by automated lifecycle tests yet.",intake:[{id:"fluent-bit",label:"Fluent Bit",transform:"otlp-passthrough"}],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:B,dashboard:{iconKey:"fluent-bit",intakeSourceId:"fluent-bit"}}});var vk,fk,kk;var f1=g(()=>{Pt();vk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",actions:[{kind:"instruction",instruction:"Create a read-only organization token from the CLI or the Fly.io dashboard.",payloads:[{kind:"options",options:[{id:"cli",label:"CLI",payloads:[{kind:"code",language:"bash",copyLabel:"flyctl read-only token command",value:"flyctl tokens create readonly -o <org-slug>"}]},{id:"dashboard",label:"Dashboard",payloads:[{kind:"external-link",label:"Open the Fly.io dashboard",href:"https://fly.io/dashboard",description:"Open the org's Tokens tab and create a read-only token."}]}]}]}]},{id:"credentials",title:"Enter credentials",actions:[{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:{provider:"fly_io",metadata:{apiToken:"$token",organizationSlug:"$orgSlug"}}}],metadata:{apiToken:"$token",organizationSlug:"$orgSlug"},button:Me},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/fly-io"},fk={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.",notes:[{text:"The shipper reads Fly's internal NATS log stream, so it must run in 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."}],actions:[{instruction:"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:"config",title:"Set the shipper secrets",actions:[{instruction:"Set the fly-log-shipper secrets (Option A): `HTTP_URL` is your intake URL (above); `HTTP_TOKEN` is the key below.",payloads:[{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}"'}]},{instruction:"If you chose the dedicated OTLP shipper (Option B), POST OTLP `resourceLogs` to the endpoint below — with the same public key as a bearer token — instead of setting the two secrets above.",payloads:[{kind:"showIngestUrl",label:"OTLP endpoint (Option B)",pathSuffix:"/v1/logs"}]}]},{id:"verify",section:"verify",title:"Deploy and verify",actions:[{instruction:"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"},kk={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 h7,u7,k1;var S1=g(()=>{f1();h7=["apiToken"],u7={id:"fly-io",label:"Fly.io",transform:"otlp-with-fly-log-shipper"},k1={id:"fly_io",name:"Fly.io",searchAliases:["fly","flyio"],capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],lifecycleEligible:!0,sensitiveFields:h7,serverOwnedStreamConfigFields:["webhookUrl"],intake:[u7],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:B,dashboard:{iconKey:"fly-io",intakeSourceId:"fly-io",streamSelectorLayout:"sidepanel",actions:{submit:{validate:{procedure:"logSources.validateConnection"}},list:{list:{kind:"source-action",actionId:"list-apps",itemsField:"apps"}}}}}});var Sk,Pk,$k;var P1=g(()=>{Pt();Sk={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.",notes:[{text:"Sazabi turns on the required APIs and sets up the log pipeline in your GCP project automatically."}],actions:[{kind:"instruction",instruction:"Grant the service account the following roles on the target GCP project(s).",payloads:[{kind:"copyable-list",items:[{value:"roles/serviceusage.serviceUsageAdmin"},{value:"roles/logging.configWriter"},{value:"roles/pubsub.admin"},{value:"roles/browser"}]},{kind:"external-link",label:"Enable the Service Usage API",href:"https://console.cloud.google.com/apis/library/serviceusage.googleapis.com"}],notes:[{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:"instruction",instruction:"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`.",payloads:[{kind:"external-link",label:"Open service accounts in GCP Console",href:"https://console.cloud.google.com/iam-admin/serviceaccounts"}]}]},{id:"credentials",title:"Enter service account key",actions:[{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"},displayName:"GCP $validateKey.projectId",button:Me}}},{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"},Pk={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"}}}},$k={docsUrl:"https://docs.sazabi.com/data/sources/endpoint/gcp",groups:[{id:"prepare",section:"config",title:"Prepare GCP pipeline",description:"Create a Cloud Logging sink, Pub/Sub topic, and collector subscription.",notes:[{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`)."}],actions:[{instruction:"Create a Pub/Sub topic and subscription in your GCP project (e.g. `sazabi-logs` and `sazabi-logs-sub`)."},{instruction:"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."},{instruction:"Deploy an OpenTelemetry Collector (e.g. on a GCE instance, GKE pod, or Cloud Run service) using the `opentelemetry-collector-contrib` distribution."},{instruction:"Ensure the collector's service account has the `roles/pubsub.subscriber` IAM role on the subscription."}]},{id:"collector",section:"config",title:"Configure collector",notes:[{variant:"requirement",text:"The receiver requires the `googlecloudlogentry_encoding` encoding extension."}],actions:[{instruction:"Use a `googlecloudpubsub` receiver and `otlp_http` exporter.",payloads:[{kind:"code",label:"Example collector configuration",language:"yaml",copyLabel:"Collector configuration",value:`extensions:
|
|
7014
7014
|
googlecloudlogentry_encoding:
|
|
7015
7015
|
|
|
7016
7016
|
receivers:
|
|
@@ -7319,7 +7319,7 @@ sentry_sdk.init(
|
|
|
7319
7319
|
dsn=SENTRY_DSN,
|
|
7320
7320
|
enable_logs=True,
|
|
7321
7321
|
before_send=_forward_to_sazabi,
|
|
7322
|
-
)`}],notes:[{text:"The Python SDK has no built-in multiplexed transport, so a second `Client` plus a `before_send` hook forwards a copy of each event to Sazabi; returning `event` keeps your primary Sentry project receiving it."},{text:"`before_send` forwards error events only — structured logs stay on your primary Sentry project on this path. Verify Sazabi delivery with a test exception."}]}]}]}]},{id:"verify",section:"verify",title:"Verify telemetry",actions:[{instruction:"Restart the app, then send a test exception and write a structured log to confirm they arrive in Sazabi.",notes:[{text:"The snippet above already enables structured logging (`enable_logs=True`)."},{text:"This DSN also works with other official Sentry SDKs including Go, Ruby, Java, and .NET."}]}]}]}}]}});var Tx;var Ox=g(()=>{Ax();Tx={id:"sentry",name:"Sentry SDK",searchAliases:["sentry"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"sentry-dsn",label:"Sentry SDK",transform:"sentry-envelope"}],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:B,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-dsn"}}});var Fk,Yk;var Lx=g(()=>{Pt();Fk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",notes:[{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)."}],actions:[{kind:"instruction",instruction:"Create a Sentry user auth token with **Organization: Read & Write** (`org:write`), **Project: Read**, and **Issue & Event: Read**.",payloads:[{kind:"external-link",label:"Open Sentry auth token settings",href:"https://sentry.io/settings/account/api/auth-tokens/new-token/"}],notes:[{text:"The `org:write` scope only lets Sazabi create the Internal Integration; the integration itself only receives read-level webhook events."}]},{kind:"instruction",instruction:"Confirm the Permissions Preview at the bottom of the Sentry form shows `event:read, org:write, project:read` before submitting."}]},{id:"credentials",title:"Enter credentials",actions:[{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:{sentryAuthToken:"$token",organizationSlug:"$organizationSlug"},button:Me},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/sentry"},Yk={groups:[{id:"create-integration",section:"config",title:"Create the Internal Integration",notes:[{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."}],actions:[{instruction:"In Sentry, go to **Settings → Developer Settings → Custom Integrations** and choose **New Internal Integration**.",payloads:[{kind:"external-link",label:"Open Sentry Custom Integrations",href:"https://sentry.io/settings/developer-settings/"}]},{instruction:"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:"config",title:"Set the webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the Internal Integration's Webhook URL field."},{instruction:"Save the integration."}]},{id:"verify",section:"verify",title:"Verify",actions:[{instruction:"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."},{instruction:"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 — alerts are opt-in."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/sentry-platform"}});var A7,T7,Cx;var Dx=g(()=>{Lx();A7=["sentryAuthToken"],T7={id:"sentry-platform",label:"Sentry Platform",transform:"sentry-platform-webhook"},Cx={id:"sentry_platform",name:"Sentry",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],streamCardinality:"single",sensitiveFields:A7,serverOwnedStreamConfigFields:["sentryAppSlug"],intake:[T7],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:B,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-platform",actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["token"]}}}}}});var Qk;var zx=g(()=>{Qk={groups:[{id:"open-form",section:"config",title:"Open log drain form",notes:[{variant:"requirement",text:"Log Drains require a Supabase Pro, Team, or Enterprise plan."}],actions:[{instruction:"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",actions:[{instruction:"Fill in the **Name** and **Description** fields.",payloads:[{kind:"copyable",label:"Name",value:"Sazabi"},{kind:"copyable",label:"Description",value:"Forward Supabase logs to Sazabi for observability and AI analysis."}]},{instruction:"Set **Type** to **OpenTelemetry Protocol (OTLP)**."}]},{id:"otlp-endpoint",section:"config",title:"OTLP Endpoint",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **OTLP Endpoint** field."}]},{id:"delivery-fields",section:"config",title:"Finish drain fields",actions:[{instruction:"Fill in the **Protocol** field.",payloads:[{kind:"copyable",label:"Protocol",value:"HTTP/Protobuf"}]},{instruction:"Set **Gzip Compression** to **Enabled**."}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"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 _x;var jx=g(()=>{zx();_x={id:"supabase",name:"Supabase",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"supabase",label:"Supabase",transform:"supabase-drain"}],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:B,dashboard:{iconKey:"supabase",intakeSourceId:"supabase"}}});var Vk;var Nx=g(()=>{Pt();Vk={groups:[{id:"instrument",section:"config",title:"Instrument workers",description:"Set up each Temporal worker runtime to send OpenTelemetry data.",actions:[...ou("Temporal worker")]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy or restart your Temporal workers, then run a workflow or activity to generate fresh telemetry."}]}]}});var xx;var Rx=g(()=>{Nx();xx={id:"temporal",name:"Temporal",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual worker setup is not exercised by automated lifecycle tests yet.",intake:[{id:"temporal",label:"Temporal",transform:"otlp-passthrough"}],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:B,dashboard:{iconKey:"temporal",intakeSourceId:"temporal"}}});var eS;var Ux=g(()=>{eS={perStreamInstructions:!0,groups:[{id:"prepare",section:"config",title:"Prepare Trigger.dev project",actions:[{instruction:"Install `@opentelemetry/exporter-logs-otlp-http` in the package that owns your `trigger.config.ts` file."},{instruction:"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:"configure",section:"config",title:"Configure log exporter",actions:[{instruction:"Add the OTLP log exporter to `trigger.config.ts`.",payloads:[{kind:"code",label:"`trigger.config.ts`",language:"typescript",value:`import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
|
|
7322
|
+
)`}],notes:[{text:"The Python SDK has no built-in multiplexed transport, so a second `Client` plus a `before_send` hook forwards a copy of each event to Sazabi; returning `event` keeps your primary Sentry project receiving it."},{text:"`before_send` forwards error events only — structured logs stay on your primary Sentry project on this path. Verify Sazabi delivery with a test exception."}]}]}]}]},{id:"verify",section:"verify",title:"Verify telemetry",actions:[{instruction:"Restart the app, then send a test exception and write a structured log to confirm they arrive in Sazabi.",notes:[{text:"The snippet above already enables structured logging (`enable_logs=True`)."},{text:"This DSN also works with other official Sentry SDKs including Go, Ruby, Java, and .NET."}]}]}]}}]}});var Tx;var Ox=g(()=>{Ax();Tx={id:"sentry",name:"Sentry SDK",searchAliases:["sentry"],capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"sentry-dsn",label:"Sentry SDK",transform:"sentry-envelope"}],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:B,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-dsn"}}});var Fk,Yk;var Lx=g(()=>{Pt();Fk={kind:"multi-step",steps:[{id:"prepare",title:"Create token",notes:[{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)."}],actions:[{kind:"instruction",instruction:"Create a Sentry **User Auth Token** (not an Organization Auth Token) with **Organization: Read & Write** (`org:write`), **Project: Read**, and **Issue & Event: Read** scopes. User Auth Tokens are created under your personal Sentry settings; Organization Auth Tokens (under org settings) require different management and scopes — use a User Auth Token.",payloads:[{kind:"external-link",label:"Open Sentry auth token settings",href:"https://sentry.io/settings/account/api/auth-tokens/new-token/"}],notes:[{text:"The `org:write` scope only lets Sazabi create the Internal Integration; the integration itself only receives read-level webhook events."}]},{kind:"instruction",instruction:"Confirm the Permissions Preview at the bottom of the Sentry form shows `event:read, org:write, project:read` before submitting."}]},{id:"credentials",title:"Enter credentials",actions:[{id:"token",kind:"secret",label:"Sentry auth token",instruction:"Enter your Sentry auth token below.",description:"A Sentry User Auth Token (not Organization Auth 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:{sentryAuthToken:"$token",organizationSlug:"$organizationSlug"},button:Me},docsUrl:"https://docs.sazabi.com/data/sources/connect-your-account/sentry"},Yk={groups:[{id:"create-integration",section:"config",title:"Create the Internal Integration",notes:[{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."}],actions:[{instruction:"In Sentry, go to **Settings → Developer Settings → Custom Integrations** and choose **New Internal Integration**.",payloads:[{kind:"external-link",label:"Open Sentry Custom Integrations",href:"https://sentry.io/settings/developer-settings/"}]},{instruction:"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:"config",title:"Set the webhook URL",actions:[{instruction:"Paste your Sazabi intake URL (above) into the Internal Integration's Webhook URL field."},{instruction:"Save the integration."}]},{id:"verify",section:"verify",title:"Verify",actions:[{instruction:"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."},{instruction:"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 — alerts are opt-in."}]}],docsUrl:"https://docs.sazabi.com/data/sources/endpoint/sentry-platform"}});var A7,T7,Cx;var Dx=g(()=>{Lx();A7=["sentryAuthToken"],T7={id:"sentry-platform",label:"Sentry Platform",transform:"sentry-platform-webhook"},Cx={id:"sentry_platform",name:"Sentry",capabilities:["connectionless","managed"],auth:["apiToken"],delivery:["push"],streamCardinality:"single",sensitiveFields:A7,serverOwnedStreamConfigFields:["sentryAppSlug"],intake:[T7],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:B,dashboard:{iconKey:"sentry",intakeSourceId:"sentry-platform",actions:{submit:{validate:{kind:"source-action",actionId:"validate",sensitiveInputFields:["token"]}}}}}});var Qk;var zx=g(()=>{Qk={groups:[{id:"open-form",section:"config",title:"Open log drain form",notes:[{variant:"requirement",text:"Log Drains require a Supabase Pro, Team, or Enterprise plan."}],actions:[{instruction:"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",actions:[{instruction:"Fill in the **Name** and **Description** fields.",payloads:[{kind:"copyable",label:"Name",value:"Sazabi"},{kind:"copyable",label:"Description",value:"Forward Supabase logs to Sazabi for observability and AI analysis."}]},{instruction:"Set **Type** to **OpenTelemetry Protocol (OTLP)**."}]},{id:"otlp-endpoint",section:"config",title:"OTLP Endpoint",actions:[{instruction:"Paste your Sazabi intake URL (above) into the **OTLP Endpoint** field."}]},{id:"delivery-fields",section:"config",title:"Finish drain fields",actions:[{instruction:"Fill in the **Protocol** field.",payloads:[{kind:"copyable",label:"Protocol",value:"HTTP/Protobuf"}]},{instruction:"Set **Gzip Compression** to **Enabled**."}]},{id:"save",section:"verify",title:"Save and verify",actions:[{instruction:"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 _x;var jx=g(()=>{zx();_x={id:"supabase",name:"Supabase",capabilities:["connectionless"],auth:[],delivery:["push"],intake:[{id:"supabase",label:"Supabase",transform:"supabase-drain"}],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:B,dashboard:{iconKey:"supabase",intakeSourceId:"supabase"}}});var Vk;var Nx=g(()=>{Pt();Vk={groups:[{id:"instrument",section:"config",title:"Instrument workers",description:"Set up each Temporal worker runtime to send OpenTelemetry data.",actions:[...ou("Temporal worker")]},{id:"redeploy",section:"verify",title:"Redeploy and verify",actions:[{instruction:"Redeploy or restart your Temporal workers, then run a workflow or activity to generate fresh telemetry."}]}]}});var xx;var Rx=g(()=>{Nx();xx={id:"temporal",name:"Temporal",capabilities:["connectionless"],auth:[],delivery:["push"],lifecycleSkipReason:"Manual worker setup is not exercised by automated lifecycle tests yet.",intake:[{id:"temporal",label:"Temporal",transform:"otlp-passthrough"}],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:B,dashboard:{iconKey:"temporal",intakeSourceId:"temporal"}}});var eS;var Ux=g(()=>{eS={perStreamInstructions:!0,groups:[{id:"prepare",section:"config",title:"Prepare Trigger.dev project",actions:[{instruction:"Install `@opentelemetry/exporter-logs-otlp-http` in the package that owns your `trigger.config.ts` file."},{instruction:"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:"configure",section:"config",title:"Configure log exporter",actions:[{instruction:"Add the OTLP log exporter to `trigger.config.ts`.",payloads:[{kind:"code",label:"`trigger.config.ts`",language:"typescript",value:`import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
|
|
7323
7323
|
import { defineConfig } from "@trigger.dev/sdk";
|
|
7324
7324
|
|
|
7325
7325
|
export default defineConfig({
|