> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Sending OpenTelemetry to ClickStack with Telflo

> Build and roll out OpenTelemetry Collector configurations that send telemetry to ClickStack or write it straight into ClickHouse, with Telflo managing the collector fleet

export const PartnerBadge = () => {
  return <div className="PartnerBadge">
            <div className="PartnerBadgeIcon">
                <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <polyline points="12.5 9.5 10 12 6 11 2.5 8.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1" />
                    <polyline points="4.54 4.41 8 3.5 11.46 4.41" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1" />
                    <path d="M2.15,3.78 L0.55,6.95 A0.5,0.5 0,0,0 0.77,7.62 L2.5,8.5 L4.54,4.41 L2.82,3.55 A0.5,0.5 0,0,0 2.15,3.78 Z" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1" />
                    <path d="M13.5,8.5 L15.23,7.62 A0.5,0.5 0,0,0 15.45,6.95 L13.85,3.78 A0.5,0.5 0,0,0 13.18,3.55 L11.46,4.41 Z" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1" />
                    <path d="M11.5,4.5 L9,4.5 L6.15,7.27 A0.5,0.5 0,0,0 6.24,8.05 C7.33,8.74 8.81,8.72 10,7.5 L12.5,9.5 L13.5,8.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1" />
                    <polyline points="7.75 13.5 5.15 12.85 3.5 11.67" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1" />
                </svg>
            </div>
            Partner Integration
        </div>;
};

export const Image = ({img, alt, size = "lg", background}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  const backgroundColor = background === "white" ? "white" : background === "black" ? "rgb(31 31 28)" : undefined;
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} style={{
    backgroundColor
  }} />
      </Frame>
    </div>;
};

<PartnerBadge />

<Info>
  **TL;DR**

  This guide shows you how to send telemetry to ClickStack from OpenTelemetry Collectors managed by Telflo. You'll learn how to:

  * Build a collector configuration in Telflo's visual editor or using the CLI
  * Send the telemetry to Open Source or Managed ClickStack, or write it straight into ClickHouse
  * Remotely deploy configurations to a fleet of collectors
  * Confirm the telemetry lands in ClickStack or in your ClickHouse tables

  Time required: 15-20 minutes
</Info>

<h2 id="what-is-telflo">
  What is Telflo?
</h2>

Telflo is a vendor-neutral control plane for OpenTelemetry Collectors, providing centralized management for collector configuration across a fleet. It makes large fleets manageable with a visual editor, pipeline tests, and remote deployment of configurations. Telflo manages standard upstream OpenTelemetry collector builds, with no Telflo-specific distribution and no proprietary agent, so collectors your teams already run stay on the same build.

Telflo is also accessible outside the browser, through a [command-line interface](https://docs.telflo.com/docs/cli/). Pair that with the [ClickStack MCP server](/docs/clickstack/mcp) and the same agent that queries your telemetry can fix the pipeline that produced it.

<h2 id="why-telflo-clickstack">
  Why Telflo + ClickStack?
</h2>

ClickStack handles ingestion, storage, and analytical queries at high volume. Telflo centrally operates the fleet of OpenTelemetry Collectors that feeds it, across hosts, clusters, and regions.

Telflo provides:

* Centralized management of OpenTelemetry Collectors across hosts, containers, and Kubernetes
* Visual pipeline editing, with controlled rollouts to the whole fleet or a single group
* Changes verified against sample telemetry before they reach production collectors
* Routing the same telemetry to ClickStack and other destinations at the same time
* Fleet visibility: which collectors are online, what each one is running, and which have drifted

<Tip>
  **Key takeaways**

  * **ClickStack ingests, stores, and queries at scale**
  * **Telflo operates the collector fleet that feeds it**
</Tip>

<h2 id="prerequisites">
  Prerequisites
</h2>

* A destination: [Open Source ClickStack](/docs/clickstack/getting-started/oss), [Managed ClickStack](/docs/clickstack/getting-started/managed), or a self-managed ClickHouse instance
* Telflo account ([create an account at telflo.com](https://telflo.com))
* Somewhere for the collectors to run: a VM or a Kubernetes cluster
* **Open Source ClickStack**: your ClickStack OTLP endpoint (`4318` for HTTP, `4317` for gRPC) and your ingestion API key, found in HyperDX under **Team Settings → API Keys** ([view docs here for reference](/docs/clickstack/ingesting-data/opentelemetry#sending-otel-data))
* **Managed ClickStack**: your ClickHouse Cloud service endpoint (port `8443`) and an ingestion user (see [Creating an ingestion user](/docs/clickstack/ingesting-data/collector#creating-an-ingestion-user))
* **Self-managed ClickHouse**: your ClickHouse endpoint, a database for the [ClickStack tables](/docs/clickstack/ingesting-data/schemas), and a user that can create and write to them (see [Creating an ingestion user](/docs/clickstack/ingesting-data/collector#creating-an-ingestion-user-oss))
* Network connectivity from the collectors to your ClickStack or ClickHouse endpoint

<h2 id="integrate-telflo-clickstack">
  Integrate ClickStack with Telflo
</h2>

<Steps>
  <Step title="Build a collector configuration" id="build-configuration">
    1. Sign in to Telflo. On the **Configurations** list, click **New Configuration**, then **Blank configuration**.
    2. In **Name Your Configuration**, enter a name and click **Create**.
    3. Add receivers: drag one from the palette onto the canvas for each kind of telemetry you collect.
    4. Add processors: **Memory Limiter** and **Batch**, plus any others you need to shape data before it leaves the collector. See the [full list of processors Telflo supports](https://docs.telflo.com/docs/build/components#processors).
  </Step>

  <Step title="Add the exporter" id="add-exporter">
    All three paths use the same editor, the same publish step, and the same fleet; only the exporter differs. Pick the tab for your deployment: Open Source ClickStack takes OTLP with an ingestion key; Managed ClickStack and self-managed ClickHouse take direct writes to the ClickStack tables.

    <Tabs>
      <Tab title="Open Source ClickStack">
        1. Drag the **OTLP/HTTP** exporter onto the canvas.
        2. Set **Endpoint** to your ClickStack OTLP HTTP endpoint, for example `http://clickstack.example.com:4318`.
        3. Under **HTTP Headers**, click **Add header**, then enter `authorization` as the **Header name** and `${env:CLICKSTACK_INGESTION_KEY}` as the **Header value**. Telflo asks for the value when you install the collectors, so the key is never stored in the configuration.

        For gRPC, use the **OTLP** exporter on port `4317` with the same header under **gRPC Metadata Headers**.
      </Tab>

      <Tab title="Managed ClickStack">
        Managed ClickStack does not ship a gateway collector, so there is no hosted OTLP endpoint to send telemetry to. The collector you configure here becomes that [gateway](/docs/clickstack/ingesting-data/collector#collector-roles): give it an **OTLP** receiver alongside the ClickHouse exporter, and it writes to your ClickHouse Cloud service. Your SDKs and agent collectors then send OTLP to it on `4318` (HTTP) or `4317` (gRPC).

        1. Drag the **ClickHouse** exporter onto the canvas.
        2. Fill in **Endpoint** with your ClickHouse Cloud service endpoint (port `8443`), set **Database** to `default`, and set **Username** to your ingestion user.
        3. Set **Password** to `${env:CLICKHOUSE_PASSWORD}`. Telflo asks for the value when you install the collectors, so the credential is never stored in the configuration.
        4. Under **Schema & Tables**: if the [ClickStack tables](/docs/clickstack/ingesting-data/schemas) don't exist yet, leave **Create Schema on Startup** on and the exporter creates them. Turn it off once they exist.

        Keep **Batch** upstream of the exporter: ClickHouse performs best with batched inserts. If you already run a [ClickStack collector](/docs/clickstack/ingesting-data/collector#configuring-the-collector) as your OTLP gateway, you can instead follow the Open Source ClickStack steps, with the [`OTLP_AUTH_TOKEN`](/docs/clickstack/ingesting-data/collector#securing-the-collector) you set on that collector as the header value.
      </Tab>

      <Tab title="Self-managed ClickHouse">
        The collector you configure here acts as your [gateway](/docs/clickstack/ingesting-data/collector#collector-roles): give it an **OTLP** receiver alongside the ClickHouse exporter. Your SDKs and agent collectors send OTLP to it, and it writes to ClickHouse.

        1. Drag the **ClickHouse** exporter onto the canvas.
        2. Fill in **Endpoint** (for example `https://clickhouse.example.com:8443`), **Database**, and **Username**, pointing **Database** at the database the ClickStack tables live in.
        3. Set **Password** to `${env:CLICKHOUSE_PASSWORD}`. Telflo asks for the value when you install the collectors, so the credential is never stored in the configuration.
        4. Under **Schema & Tables**: if the ClickStack tables don't exist yet, leave **Create Schema on Startup** on and the exporter creates them. Turn it off once they exist.

        Keep **Batch** upstream of the exporter: ClickHouse performs best with batched inserts. If you already run a [ClickStack collector](/docs/clickstack/ingesting-data/collector#configuring-the-collector) as your OTLP gateway, you can instead follow the Open Source ClickStack steps, with the [`OTLP_AUTH_TOKEN`](/docs/clickstack/ingesting-data/collector#securing-the-collector) you set on that collector as the header value.
      </Tab>
    </Tabs>

    Draw edges from the receivers through the processors to the exporter, one pipeline per signal. The status row reports **config valid** or the number of errors to fix, and the **YAML** tab shows the generated configuration.

    <Image img="https://mintcdn.com/private-7c7dfe99/5NhXl45F-rkC2yU0/images/clickstack/telflo/telflo-configuration.webp?fit=max&auto=format&n=5NhXl45F-rkC2yU0&q=85&s=4b8c285f2ceaef0b8d68dfeb998fe899" alt="A collector pipeline in the Telflo editor with the ClickHouse exporter configured" size="lg" width="3418" height="1908" data-path="images/clickstack/telflo/telflo-configuration.webp" />

    Before you roll anything out, you can run sample telemetry through the configuration and check what comes out the other end. See [testing in Telflo](https://docs.telflo.com/docs/testing/overview). Alternatively, you can describe what you're trying to do and the Telflo AI assistant, opened with the **AI** button in the toolbar, builds, validates, and tests the configuration for you. Your own agent can do the same through the [Telflo CLI](https://docs.telflo.com/docs/cli/).
  </Step>

  <Step title="Publish a version" id="publish-version">
    Click **Publish** in the toolbar. Published versions are read-only; to keep iterating, click **Create New Version**.
  </Step>

  <Step title="Create a fleet and roll out" id="deploy-collectors">
    1. Go to **Fleet**, click **New Fleet**, and choose where your collectors run, on VMs or in Kubernetes. Enter a **Name** and click **Create fleet**.
    2. On the fleet's **Deploy Groups** tab, click **Assign** on the **Default** group and choose your published configuration and version.
    3. Click **Install** on the group and enter a value for each environment variable your configuration references; Telflo adds them to the install command. Run that command where the collectors should run, [following Telflo's installation instructions](https://docs.telflo.com/docs/fleet-management/install-collectors). It carries the fleet's install token along with your value, so treat it as sensitive.
    4. On the **Collectors** tab, collectors report **Pending pickup**, then **Applying**, then **In sync**.

    To roll out a change, publish a new version and assign it to the group; to roll back, assign a previously deployed version.

    <Image img="https://mintcdn.com/private-7c7dfe99/5NhXl45F-rkC2yU0/images/clickstack/telflo/telflo-fleet.webp?fit=max&auto=format&n=5NhXl45F-rkC2yU0&q=85&s=fc39b525dff977bd4f637f2b5efb3f78" alt="A Telflo fleet with every collector in sync after a rollout" size="lg" width="3420" height="1892" data-path="images/clickstack/telflo/telflo-fleet.webp" />
  </Step>

  <Step title="Verify telemetry" id="verify-telemetry">
    Open HyperDX and search for one of your services in the **Search** view; use **Chart Explorer** for metrics. With Managed ClickStack, open your service in the ClickHouse Cloud console and click **Launch ClickStack**. With self-managed ClickHouse, query the [ClickStack tables](/docs/clickstack/ingesting-data/schemas) directly, for example `SELECT ServiceName, count() FROM otel_logs GROUP BY ServiceName`.
  </Step>
</Steps>

<h2 id="advanced-configuration">
  Advanced configuration
</h2>

<h3 id="fan-out-routing">
  Fan-out routing
</h3>

The same telemetry can go to ClickStack for long-term storage, to another platform during a migration, and to a SIEM for security analysis at once. Add the exporters on the canvas and connect them to the pipelines that should feed them, or start from a prebuilt pipeline in [Telflo's flow library](https://telflo.com/flows).

<h3 id="compression-and-performance">
  Compression and performance
</h3>

* **OTLP/HTTP and OTLP exporters**: keep **Compression** at gzip.
* **ClickHouse exporter**: keep **Async Insert** on, leave **Compression** at lz4, and add a **Batch** processor upstream. See [Optimizing inserts](/docs/clickstack/ingesting-data/collector#optimizing-inserts).

<h2 id="next-steps">
  Next steps
</h2>

* **Build dashboards**: create visualizations in HyperDX for logs, metrics, and traces
* **Set up alerts**: configure alerts in ClickStack for critical conditions
* **Refine with the AI assistant**: ask it to adjust a pipeline or propose tests
* **Coming from another vendor**: [flows](https://telflo.com/flows) cover the cutover, replacing the agents already on your fleet and dual-shipping to both backends while you compare them

<h2 id="read-more">
  Read more
</h2>

* [Telflo documentation](https://docs.telflo.com/docs)
* [Quickstart: from empty canvas to a deployed collector](https://docs.telflo.com/docs/getting-started/quickstart)
* [Testing collector configurations](https://docs.telflo.com/docs/testing/overview)
* [Fleet management in Telflo](https://docs.telflo.com/docs/fleet-management/overview)
* [Installing collectors](https://docs.telflo.com/docs/fleet-management/install-collectors)
* [Ingesting with OpenTelemetry](/docs/clickstack/ingesting-data/opentelemetry)
* [ClickStack table schemas](/docs/clickstack/ingesting-data/schemas)
