Self-Hosted ClickStack Observability

A fully self-hosted observability stack in a single container.

This guide walks you through setting up Qtap with ClickStackarrow-up-right — a self-contained observability stack that bundles ClickHouse, an OTel collector, and the HyperDX UI into a single Docker image. Events and artifacts flow through OpenTelemetry, with no S3 setup required.

circle-check

What You'll Get

Component
What It Does
Port

ClickStack

ClickHouse + OTel collector + HyperDX UI

8080, 4317, 4318

Qtap

eBPF agent capturing traffic and sending via OTel

Both events (connection metadata, HTTP transactions) and objects (request/response headers and bodies) are sent through the same OTel endpoint. No separate object storage to configure.


Prerequisites

  • Docker installed

  • Linux host with kernel 5.8+ (for eBPF)

  • Root or CAP_BPF + CAP_SYS_ADMIN capabilities


Step 1: Start ClickStack

docker run -d --name clickstack \
   -p 8080:8080 \
   -p 4317:4317 \
   -p 4318:4318 \
   -e BETA_CH_OTEL_JSON_SCHEMA_ENABLED=true \
   clickhouse/clickstack-local:latest

Wait for it to be ready:

Once you see the startup complete, visit http://localhost:8080arrow-up-right to access the HyperDX UI.


Step 2: Create the Qtap Configuration

Create a file called qtap-clickstack.yaml:

This configuration:

  • Sends events (connection metadata, HTTP transaction summaries) to ClickStack via OTel

  • Sends objects (full request/response headers and bodies) to ClickStack via OTel

  • Captures all egress HTTP traffic at full detail level

  • Both stores share the same OTel endpoint — no S3 credentials needed

circle-info

This replaces many small S3 files with batched OTLP log records, which ClickHouse ingests efficiently.


Step 3: Start Qtap

Verify Qtap is running and connected:

You should see the eventstore and objectstore initialize successfully:


Step 4: Generate Traffic and View

Generate some traffic:

Open http://localhost:8080arrow-up-right in your browser. In the HyperDX UI, create a source with table name otel_logs to view captured events and artifacts.

You'll see:

  • Connection events — TCP connections with protocol detection, TLS info, process attribution

  • HTTP transaction summaries — method, URL, status, duration, content type

  • Full request/response data — headers and bodies captured by the http_capture plugin


How It Works

Qtap captures traffic using eBPF and exports both event metadata and full artifacts as OpenTelemetry Logs. ClickStack receives them through its built-in OTel collector and stores everything in ClickHouse.


Configuration Options

Capture Level

Control how much detail is captured per request:

Level
What's Captured

none

Connection metadata only

summary

HTTP method, URL, status, duration

details

Summary + headers

full

Summary + headers + bodies

Change the level in the http_capture plugin:

Traffic Direction

Control which traffic is captured:

Direction
What's Captured

egress

All outbound traffic

egress-external

Only external destinations

egress-internal

Only internal destinations


Cleanup


Next Steps

Last updated