← Back to Blog
Deployment Guide July 2026 18 min read

Setting Up Native OpenTelemetry Log and Trace Storage with Zero Cost

Learn how to deploy a complete observability platform using OpenTelemetry, Apache Doris and XplurData. This guide walks through Docker deployment, OTLP configuration, Apache Doris schema creation, sample application instrumentation, and building a production-ready logging and tracing platform without expensive licensing costs.

XD
XplurData Engineering Team
Open Source Observability Platform

Deploy Enterprise Observability Without Enterprise Licensing

Most observability platforms start simple but quickly become expensive as your telemetry volume grows. Licensing models based on hosts, ingestion rates, or indexed data often make long-term retention and organization-wide adoption difficult.

XplurData takes a different approach by combining OpenTelemetry with Apache Doris, giving engineering teams complete ownership of their observability platform while avoiding vendor lock-in.

Instead of maintaining multiple databases for logs, traces, and analytics, all telemetry is stored inside Apache Doris where it can be searched, filtered, aggregated, and correlated using standard SQL.

What you'll build

By the end of this guide you'll have a complete OpenTelemetry pipeline collecting logs and traces into Apache Doris, with XplurData providing real-time search, dashboards, trace exploration and Smart Query.

50K+
Log events per second
<200ms
Average search latency
8:1
Average compression ratio
$0
Software licensing cost

Platform Architecture

Unlike traditional observability stacks that require separate databases for logs, metrics and traces, XplurData stores operational data inside Apache Doris while OpenTelemetry Collector acts as the unified ingestion layer.

01
Applications Instrument your applications using OpenTelemetry SDKs for Java, Python, Go, .NET, Node.js or any supported language.
02
OpenTelemetry Collector Receives telemetry through OTLP gRPC and HTTP, batches requests, applies processors and exports data into XplurData.
03
XD API + Apache Doris The API validates incoming telemetry and stores structured log and trace records into Apache Doris for high-speed analytics.
04
XplurData UI Search billions of events using Smart Query, BM25 search, dashboards, trace explorer, log patterns and interactive visualizations.

Why This Architecture Works

Every component has a clearly defined responsibility.

  • Applications generate telemetry using OpenTelemetry SDKs.
  • OpenTelemetry Collector standardizes ingestion and buffering.
  • XplurData API validates and enriches incoming events.
  • Apache Doris stores telemetry using a massively parallel columnar engine.
  • The XplurData frontend provides search, dashboards, tracing and operational analytics.
No vendor lock-in

Because OpenTelemetry is an open standard and Apache Doris is open source, your telemetry remains portable. You own your infrastructure, data and retention policies.

Prerequisites

Before deploying XplurData, make sure your environment meets the following minimum requirements. While the platform can run on a laptop for evaluation, a production deployment should use dedicated infrastructure.

Component Minimum Recommended
CPU 4 Cores 8+ Cores
Memory 8 GB 16–32 GB
Storage 50 GB SSD NVMe SSD
Docker 28.x Latest Stable
Docker Compose v2 Latest Stable
Production Recommendation

For production environments, deploy Apache Doris Frontend and Backend nodes on separate servers and use persistent volumes for data durability.

Step 1 — Clone the Repository

Download the latest XplurData deployment package from GitHub.

Terminal
git clone https://github.com/xplurdata/xplurdata.git

cd xplurdata

The repository contains everything required to deploy the platform, including Docker Compose files, OpenTelemetry Collector configuration, Apache Doris initialization scripts and the XplurData frontend.

Repository Structure

Project Structure
xplurdata/

├── api/

├── collector/

├── dashboard/

├── doris/

├── docker/

├── frontend/

├── scripts/

├── docker-compose.yml

└── README.md

Step 2 — Start the Platform

Once the repository has been cloned, start every service using Docker Compose.

docker-compose.yml
docker compose up -d

The first startup may take several minutes while Docker downloads the required container images.

Containers Started

Container Purpose
Apache Doris FE SQL gateway and query planner
Apache Doris BE Columnar storage engine
XD API Telemetry ingestion service
OTel Collector Receives OTLP telemetry
XplurData UI Log Explorer and dashboards

Step 3 — Verify the Deployment

Check that every container is running correctly.

Docker
docker ps

You should see all platform services reporting a healthy status.

Expected Output
✔ Apache Doris FE

✔ Apache Doris BE

✔ XD API

✔ OTel Collector

✔ XplurData Frontend

Step 4 — Open the Platform

After deployment completes, open the following endpoints in your browser.

Service URL
XplurData UI http://localhost:3000
XD API http://localhost:8080
OTLP HTTP http://localhost:4318
OTLP gRPC localhost:4317
Apache Doris FE http://localhost:8030
Deployment Complete

At this point the platform is operational. The next step is configuring the OpenTelemetry Collector so applications can begin sending logs and distributed traces into Apache Doris.

Step 5 — Configure the OpenTelemetry Collector

The OpenTelemetry Collector is responsible for receiving telemetry from your applications, processing it, batching requests and forwarding them to the XplurData API. Instead of every application talking directly to the backend database, applications send telemetry using the standard OTLP protocol while the collector handles routing, retries and buffering.

Why use the Collector?

Using the OpenTelemetry Collector decouples applications from your observability backend. You can change storage engines, add processors, filter data or export to multiple destinations without modifying application code.

Collector Configuration (otelcol.yaml)

The following configuration enables OTLP receivers, uses the batch processor for improved throughput, and exports telemetry to the XplurData API.

otelcol.yaml
receivers:

  otlp:

    protocols:

      grpc:

      http:



processors:

  batch:

    timeout: 5s

    send_batch_size: 1000



exporters:

  otlphttp:

    endpoint: http://xd-api:8080/otlp



service:

  pipelines:

    logs:

      receivers: [otlp]

      processors: [batch]

      exporters: [otlphttp]



    traces:

      receivers: [otlp]

      processors: [batch]

      exporters: [otlphttp]

Understanding Receivers

Receivers define how telemetry enters the collector. In most deployments, applications communicate using the OpenTelemetry Protocol (OTLP), making the OTLP receiver the primary entry point.

OTLP gRPC

High-performance binary protocol used by most SDKs and production applications.

OTLP HTTP

Simple HTTP endpoint for browsers, serverless environments and lightweight services.

Understanding Processors

Processors modify telemetry before it reaches storage. The batch processor groups events together, reducing network overhead and significantly improving throughput.

Processor Purpose
Batch Combines events into larger payloads
Memory Limiter Protects collector memory usage
Attributes Adds or removes metadata
Resource Normalizes service information

Understanding Exporters

Exporters define where processed telemetry is delivered. In this deployment, the OTLP HTTP exporter sends logs and traces directly to the XplurData API, which validates incoming telemetry before storing it inside Apache Doris.

One API for Everything

Both logs and traces are delivered through the same ingestion endpoint, simplifying configuration while keeping telemetry processing consistent.

Telemetry Flow

1
Application Creates logs and spans.
2
Collector Receives OTLP traffic.
3
XD API Processes telemetry.
4
Apache Doris Stores logs and traces for analytics.

Production Best Practices

  • Always enable batching to improve throughput.
  • Configure memory limits to avoid collector crashes.
  • Use HTTPS for external OTLP endpoints.
  • Deploy multiple collectors behind a load balancer for high availability.
  • Monitor collector CPU and queue depth.
  • Enable compression for WAN deployments.
Avoid Direct Database Writes

Applications should never connect directly to Apache Doris. Always send telemetry through the OpenTelemetry Collector and XplurData API to ensure validation, enrichment, batching, authentication and future compatibility.

Step 6 — Create the Apache Doris Schema

Apache Doris is the analytics engine powering XplurData. Instead of storing telemetry in multiple databases, logs and traces are stored in columnar OLAP tables that support extremely fast filtering, aggregation and full-text search.

This architecture enables billions of log records to be queried with interactive response times while significantly reducing storage costs through compression and columnar encoding.

Why Apache Doris?

Apache Doris combines real-time ingestion, analytical SQL, high compression ratios and distributed execution into a single database, making it an excellent storage engine for observability workloads.

Creating the Log Table

The following example creates a simplified log table used by XplurData.

logs.sql
CREATE TABLE otel_logs (

timestamp DATETIME,

trace_id STRING,

span_id STRING,

service_name STRING,

severity STRING,

body STRING,

attributes JSON

)

ENGINE=OLAP

DUPLICATE KEY(timestamp, service_name)

DISTRIBUTED BY HASH(service_name)

BUCKETS 16

PROPERTIES (

"replication_num"="1",

"compression"="zstd"

);

Creating the Trace Table

Distributed tracing data is stored separately, allowing traces to be searched independently while still supporting correlation with logs through the Trace ID.

traces.sql
CREATE TABLE otel_traces (

trace_id STRING,

span_id STRING,

parent_span_id STRING,

service_name STRING,

operation_name STRING,

start_time DATETIME,

duration BIGINT,

status STRING,

attributes JSON

)

ENGINE=OLAP

DUPLICATE KEY(trace_id, span_id)

DISTRIBUTED BY HASH(trace_id)

BUCKETS 16

PROPERTIES (

"replication_num"="1",

"compression"="zstd"

);

Storage Strategy

Feature Configuration Benefit
Compression ZSTD Reduces storage cost by up to 8×
Distribution Hash Buckets Parallel query execution
Columnar Storage Enabled Fast analytical queries
Duplicate Key Timestamp + Service High-speed ingestion
JSON Attributes Native JSON Flexible schema evolution

Partitioning Strategy

Large observability deployments should partition data by time to improve query performance and simplify retention management.

Daily Partitions

Ideal for high-ingestion environments where billions of records are written every day.

Monthly Partitions

Suitable for smaller environments where long-term retention is more important than ingestion rate.

Indexing Recommendations

Although Apache Doris scans columns efficiently, choosing appropriate keys and distribution columns greatly improves performance.

Column Reason
timestamp Time range filtering
service_name Service-level searches
trace_id Trace correlation
severity Error filtering
operation_name Trace analysis

Example Query

Once telemetry is stored, engineers can analyze operational events using standard SQL.

SQL
SELECT

service_name,

COUNT(*) AS total_errors

FROM otel_logs

WHERE severity='ERROR'

AND timestamp >= NOW() - INTERVAL 1 HOUR

GROUP BY service_name

ORDER BY total_errors DESC;

Storage Best Practices

  • Use ZSTD compression for production deployments.
  • Distribute tables using service_name or trace_id.
  • Partition large tables by time.
  • Separate logs and traces into dedicated tables.
  • Archive historical data using lifecycle policies.
  • Monitor compaction jobs regularly.
Storage Ready

The platform is now capable of storing logs and distributed traces. The next step is instrumenting applications and sending real telemetry through the OpenTelemetry Collector.

Step 7 — Instrument Your Application

Now that the platform is running and Apache Doris has been configured, it's time to send your first telemetry. One of OpenTelemetry's biggest advantages is that every supported language follows the same concepts. Whether you're using Java, Python, Go, .NET or Node.js, your applications communicate with the collector using OTLP.

No Vendor SDK Required

Unlike proprietary observability platforms, XplurData only requires the standard OpenTelemetry SDK. There are no proprietary libraries or agents to install.

Python Example

Install the required OpenTelemetry packages.

pip
pip install \
opentelemetry-sdk \
opentelemetry-exporter-otlp

Configure the OTLP endpoint.

Python
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318

OTEL_SERVICE_NAME=payment-service

Java Example

Java applications can use the OpenTelemetry Java Agent without modifying application code.

Java Agent
java \
-javaagent:opentelemetry-javaagent.jar \
-Dotel.service.name=payment-service \
-Dotel.exporter.otlp.endpoint=http://localhost:4317 \
-jar app.jar

Node.js Example

Node.js
npm install

@opentelemetry/sdk-node

@opentelemetry/exporter-trace-otlp-http

@opentelemetry/auto-instrumentations-node

Step 8 — Verify Incoming Logs

Once applications begin sending telemetry, verify that the OpenTelemetry Collector is receiving requests.

Docker
docker logs otel-collector

--follow

You should see successful export messages similar to:

Collector Output
Exporting 542 log records...

Exporting 38 traces...

Batch completed successfully.

Verify Data Inside Apache Doris

Connect to Apache Doris and run a simple SQL query.

SQL
SELECT

COUNT(*)

FROM otel_logs;

The row count should begin increasing as applications continue sending telemetry.

Step 9 — Explore Telemetry

Open the XplurData dashboard. You should now be able to search, filter, aggregate and correlate telemetry across services.

Smart Query

Search billions of log events using natural filtering syntax.

BM25 Search

Perform relevance-ranked full-text searches across logs.

Distributed Tracing

Navigate requests across services using Trace IDs.

Interactive Dashboards

Visualize operational trends in real time.

Troubleshooting

1
Collector Not Receiving Data

Verify that applications are exporting telemetry to the correct OTLP endpoint and ensure ports 4317 or 4318 are reachable.

2
No Logs in XplurData

Check collector logs, verify the exporter configuration, and confirm the XD API is running.

3
Slow Queries

Review partitioning, bucket count, compression settings and available memory on Apache Doris.

4
High Collector CPU

Increase batch size, enable memory limiter, or deploy multiple collectors behind a load balancer.

Performance Tuning

A default installation is suitable for evaluation and small deployments, but production environments should be tuned based on expected telemetry volume, retention requirements and query workload.

8+
Recommended CPU Cores
32GB
Recommended Memory
NVMe
Preferred Storage
3
Doris Backend Nodes

Production Recommendations

  • Deploy three Apache Doris Frontend nodes for high availability.
  • Use three or more Backend nodes to distribute storage and queries.
  • Store data on NVMe SSDs for optimal query performance.
  • Run multiple OpenTelemetry Collectors behind a load balancer.
  • Enable HTTPS and authentication for all production endpoints.
  • Monitor collector queue depth and exporter latency.
  • Configure automatic backups and retention policies.
Production Ready

The architecture is designed to scale horizontally by adding additional Collector instances and Apache Doris Backend nodes without changing application instrumentation.

Deploying on Kubernetes

Although Docker Compose is perfect for local evaluation, Kubernetes provides better scalability, resilience and lifecycle management for production deployments.

Collector

Deploy multiple Collector replicas using a Deployment and expose them through a Kubernetes Service.

Apache Doris

Run Frontend and Backend nodes using StatefulSets with persistent volumes.

XplurData API

Scale the ingestion API horizontally using Deployments and Horizontal Pod Autoscaling.

Ingress

Expose the UI and API securely using an Ingress Controller with TLS.

Frequently Asked Questions

Can I use existing OpenTelemetry SDKs?

Yes. XplurData uses the standard OpenTelemetry protocol and works with official SDKs for Java, Python, Go, .NET, Node.js and other supported languages.

Can I migrate from Elasticsearch?

Yes. Existing observability pipelines can be migrated gradually by pointing OpenTelemetry Collectors to the XplurData ingestion endpoint.

Does the platform support Kubernetes?

Yes. XplurData is designed to run on Kubernetes using standard Deployments, StatefulSets and Persistent Volumes.

Can I ingest metrics?

Yes. The platform roadmap includes native support for logs, traces, metrics and profiling using OpenTelemetry.

Conclusion

Modern observability should not require expensive licensing or proprietary agents. By combining OpenTelemetry, Apache Doris and XplurData, engineering teams can build a powerful, standards-based observability platform that scales from local development to enterprise production environments.

With Docker-based deployment, native OTLP ingestion, distributed analytics and an intuitive user interface, XplurData enables teams to focus on improving application reliability instead of managing complex observability infrastructure.

Ready to Explore XplurData?

Deploy the platform, connect your applications using OpenTelemetry and start exploring logs and traces with zero software licensing costs.

Download XplurData
XD

XplurData Engineering Team

Building the next generation open-source observability platform.

The XplurData Engineering Team focuses on scalable observability, OpenTelemetry, Apache Doris, distributed systems and high-performance analytics. Our goal is to make enterprise-grade observability accessible through open standards and open-source technologies.