Portal Community

The Three Required Environment Variables

VariableValueDescription
OTEL_EXPORTER_OTLP_ENDPOINThttp://otel-collector:4317Where to send telemetry. Use the OTel Collector address (gRPC). Use http:// prefix for gRPC; https:// if TLS is configured.
OTEL_SERVICE_NAMEprocessengineIdentifies this service in traces, metrics, and logs. Use consistent names: processengine, edgestream, octopus, flow-studio-api.
OTEL_RESOURCE_ATTRIBUTESenvironment=production,tenant_id=allAdditional resource attributes added to all telemetry from this service instance.

Environment Variable Configuration — Docker Compose

# In your BizFirstGO docker-compose.yml:
services:
  processengine:
    image: bizfirstgo/processengine:latest
    environment:
      # OTel Configuration
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
      - OTEL_SERVICE_NAME=processengine
      - OTEL_RESOURCE_ATTRIBUTES=environment=production,deployment.region=us-east-1
      # Optional: set sampling rate (default is 1.0 = 100%)
      - OTEL_TRACES_SAMPLER=parentbased_traceidratio
      - OTEL_TRACES_SAMPLER_ARG=0.1  # 10% sampling in production

  edgestream:
    image: bizfirstgo/edgestream:latest
    environment:
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
      - OTEL_SERVICE_NAME=edgestream
      - OTEL_RESOURCE_ATTRIBUTES=environment=production

  octopus:
    image: bizfirstgo/octopus:latest
    environment:
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
      - OTEL_SERVICE_NAME=octopus
      - OTEL_RESOURCE_ATTRIBUTES=environment=production

  flow-studio-api:
    image: bizfirstgo/flow-studio-api:latest
    environment:
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
      - OTEL_SERVICE_NAME=flow-studio-api
      - OTEL_RESOURCE_ATTRIBUTES=environment=production

Environment Variable Configuration — Kubernetes

# In your Kubernetes deployment manifest:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: processengine
spec:
  template:
    spec:
      containers:
        - name: processengine
          image: bizfirstgo/processengine:latest
          env:
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otel-collector.observe.svc.cluster.local:4317"
            - name: OTEL_SERVICE_NAME
              value: "processengine"
            - name: OTEL_RESOURCE_ATTRIBUTES
              value: "environment=production,k8s.namespace.name=bizfirstgo"
            # Inject pod name and node name as resource attributes:
            - name: OTEL_RESOURCE_ATTRIBUTES
              value: "k8s.pod.name=$(POD_NAME),k8s.node.name=$(NODE_NAME)"
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName

appsettings.json OTel Section (Additional Configuration)

For settings not covered by environment variables, BizFirstGO's OTel SDK reads from appsettings.json:

// appsettings.json
{
  "OpenTelemetry": {
    "Enabled": true,
    "Metrics": {
      "Enabled": true,
      "ExportIntervalMilliseconds": 15000  // Push metrics every 15s
    },
    "Tracing": {
      "Enabled": true,
      "SampleRate": 0.1,              // 10% of traces sampled
      "AlwaysSampleErrors": true       // Always sample error traces
    },
    "Logging": {
      "Enabled": true,
      "MinimumLevel": "Information",  // Don't send Debug logs to OTel
      "IncludeFormattedMessage": true
    }
  }
}

Per-Service Configuration Reference

ServiceOTEL_SERVICE_NAMENotes
ProcessEngineprocessenginePrimary workflow execution engine — highest telemetry volume
EdgeStreamedgestreamMessage broker — high-frequency spans for message delivery
OctopusoctopusAI agent — LLM call spans; token usage metrics
Flow Studio APIflow-studio-apiWorkflow editor backend — low volume
InstallHub APIinstallhub-apiPackage marketplace — moderate volume
AtlasForms APIatlasforms-apiForm renderer API
Service Name Must Match Loki Labels

The OTEL_SERVICE_NAME value becomes the job label in Loki and the service_name resource attribute in Tempo. Use the same value consistently — a mismatch between deployments makes cross-signal correlation fail because log queries use {job="processengine"} and traces use service.name = "processengine".