BizFirst Observe
Configure BizFirstGO Services
BizFirstGO services use the OpenTelemetry SDK, which reads configuration from environment variables. Three environment variables control where telemetry goes. Set them on each service and restart — no code changes required.
The Three Required Environment Variables
| Variable | Value | Description |
|---|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT | http://otel-collector:4317 | Where to send telemetry. Use the OTel Collector address (gRPC). Use http:// prefix for gRPC; https:// if TLS is configured. |
OTEL_SERVICE_NAME | processengine | Identifies this service in traces, metrics, and logs. Use consistent names: processengine, edgestream, octopus, flow-studio-api. |
OTEL_RESOURCE_ATTRIBUTES | environment=production,tenant_id=all | Additional 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
| Service | OTEL_SERVICE_NAME | Notes |
|---|---|---|
| ProcessEngine | processengine | Primary workflow execution engine — highest telemetry volume |
| EdgeStream | edgestream | Message broker — high-frequency spans for message delivery |
| Octopus | octopus | AI agent — LLM call spans; token usage metrics |
| Flow Studio API | flow-studio-api | Workflow editor backend — low volume |
| InstallHub API | installhub-api | Package marketplace — moderate volume |
| AtlasForms API | atlasforms-api | Form 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".