Workshop Overview

Goals, prerequisites, and architecture for the OBI workshop.

5 minutes

What You’ll Learn

By the end of this workshop, you will:

Prerequisites

Your workshop instance comes pre-configured with everything you need:

RequirementStatus on Workshop Instance
Linux hostProvided (Ubuntu)
Python 3.9+Pre-installed
Docker & Docker ComposePre-installed
K3s (Kubernetes)Pre-installed
kubectlPre-installed
Helm 3Pre-installed
Workshop assetsPre-deployed at ~/workshop/obi/

You will also need:

RequirementHow to Get It
Splunk Observability Cloud accountProvided by your instructor
Splunk Access Token (Ingest)type env in your instance look for ACCESS_TOKEN
Splunk Realm (e.g. us0, us1, eu0)type env in your instance look for REALM
A unique name (e.g. shw-2c74)env and look for INSTANCE Used as host.name

Architecture

The workshop uses three simple microservices that form a request chain:

text
Frontend (Node.js :3000)  →  Order-Processor (Go :8080)  →  Payment-Service (Go :8081)

These services have zero observability code no OpenTelemetry SDKs, no tracing headers, no instrumentation of any kind. OBI instruments them from the kernel using eBPF probes, generates OpenTelemetry-compatible traces, and sends them to a Splunk OTel Collector which forwards to Splunk Observability Cloud.

What is OBI?

OBI (OpenTelemetry eBPF Instrumentation) is a standalone agent that uses Linux kernel eBPF probes to observe HTTP/gRPC traffic flowing through applications. It attaches to processes from the kernel no SDK, no code changes, no recompilation. It sees the requests, generates OpenTelemetry-compatible trace spans, and sends them to a collector.

This is valuable for organizations that cannot or will not instrument with SDKs:

The Value Proposition

Many organizations have applications they cannot or will not instrument with OpenTelemetry SDKs:

OBI gives you full distributed tracing without any code changes:

OBI vs Traditional Zero-Code Instrumentation

OBI and existing traditional language-specific zero-code instrumentation (Java, JS, .NET, Python, Go, PHP) serve complementary roles in an observability strategy. Understanding the differences helps determine when to use each approach.

1. Instrumentation Model

AspectOBITraditional Zero-Code Instrumentations
Execution modelOut-of-processIn-process
Instrumentation layerLinux kernel / networkApplication runtime
Requires code changesNoNo or minimal
Requires application restartNoYes
Security profileIsolatedSame permission profile as the application

2. Level of Visibility

CapabilityOBITraditional Zero-Code Instrumentations
Distributed tracingProtocol-levelFull-fidelity
RED metricsYesYes
Application logs collectionNoYes
Application log-trace correlationYesYes
Application internals (frameworks, functions)No (partial, mostly in Go)Yes
Custom spans / business attributesNoYes
Runtime metrics (JVM, memory, threads)No, for nowYes

3. Coverage & Compatibility

ScenarioOBITraditional Zero-Code Instrumentations
Multi-language environmentsStrong (protocol-based)Language-specific
Third-party applicationsSupportedLimited, contrib repos
Legacy systemsSupportedLimited
Compiled languages (C/C++/Rust)Supported (with some limitations in async)Limited
Async / complex frameworksLimited in some casesStrong

4. Operational Characteristics

AspectOBITraditional Zero-Code Instrumentations
Deployment effortLow (drop-in)Medium (agent attachment)
Time to first visibilityMinutes“More” minutes
Changes to application lifecycleNoYes
Performance overheadMinimal and isolatedVaries by language/runtime

5. Splunk Distro Features

FeatureOBITraditional Zero-Code Instrumentations
Always-on ProfilingNo (may be bundled with eBPF profiler in future)CPU for most, Memory for some
Call graphsNoCPU for most, Memory for some
File-based configurationIncomingJava, Node.js, .NET, Python (incoming)
No-code instrumentationN/AYes