<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Opeyemi Afolabi</title>
    <description>The latest articles on DEV Community by Opeyemi Afolabi (@opeyemi_afolabi_a9480b0b6).</description>
    <link>https://dev.to/opeyemi_afolabi_a9480b0b6</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4036903%2Fbb271dec-36f6-451b-a1b1-d534d9d3dfbb.png</url>
      <title>DEV Community: Opeyemi Afolabi</title>
      <link>https://dev.to/opeyemi_afolabi_a9480b0b6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/opeyemi_afolabi_a9480b0b6"/>
    <language>en</language>
    <item>
      <title>How I Self-Hosted SigNoz on a Linux Server (And Everything That Went Wrong)</title>
      <dc:creator>Opeyemi Afolabi</dc:creator>
      <pubDate>Sun, 19 Jul 2026 20:54:10 +0000</pubDate>
      <link>https://dev.to/opeyemi_afolabi_a9480b0b6/how-i-self-hosted-signoz-on-a-linux-server-and-everything-that-went-wrong-4phm</link>
      <guid>https://dev.to/opeyemi_afolabi_a9480b0b6/how-i-self-hosted-signoz-on-a-linux-server-and-everything-that-went-wrong-4phm</guid>
      <description>&lt;h2&gt;
  
  
  Why Self-Host at All?
&lt;/h2&gt;

&lt;p&gt;SigNoz Cloud exists and works fine. But for the WeMakeDevs x SigNoz hackathon, I wanted to understand the full stack and not just point an SDK at a cloud endpoint. Self-hosting forces you to understand how the pieces fit together: ClickHouse as the storage backend, ZooKeeper for coordination, the OTel Collector as the ingestion layer, and SigNoz itself as the UI and API.&lt;/p&gt;

&lt;p&gt;It also means your data stays on your own infrastructure, which matters if you're building anything sensitive.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;Before starting, here's what you're actually installing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ClickHouse&lt;/strong&gt; — columnar database that stores all your traces, metrics, and logs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZooKeeper&lt;/strong&gt; — coordination service ClickHouse uses for distributed DDL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SigNoz&lt;/strong&gt; — the main backend and UI, runs on port 8080&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SigNoz OTel Collector&lt;/strong&gt; — receives telemetry from your apps and writes to ClickHouse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All four need to be running for anything to work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Install ClickHouse
&lt;/h2&gt;

&lt;p&gt;Follow the official ClickHouse install guide to get the package installed. The SigNoz docs say clearly: &lt;strong&gt;do not start the ClickHouse service yet&lt;/strong&gt;. I missed this the first time and had to restart with a clean state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; clickhouse-server clickhouse-client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not run &lt;code&gt;sudo systemctl start clickhouse-server&lt;/code&gt; yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Install ZooKeeper — Where Things Got Interesting
&lt;/h2&gt;

&lt;p&gt;The SigNoz docs tell you to download ZooKeeper 3.8.5 from the Apache CDN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://dlcdn.apache.org/zookeeper/zookeeper-3.8.5/apache-zookeeper-3.8.5-bin.tar.gz &lt;span class="nt"&gt;-o&lt;/span&gt; zookeeper.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns a 196-byte HTML 404 page. ZooKeeper 3.8.5 does not exist on that mirror yet. The fix is to use the Apache archive mirror with 3.8.4:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz &lt;span class="nt"&gt;-O&lt;/span&gt; zookeeper.tar.gz
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; zookeeper.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;archive.apache.org&lt;/code&gt; has every released version. &lt;code&gt;dlcdn.apache.org&lt;/code&gt; only keeps recent ones. When the docs reference a version that isn't out yet, always fall back to the archive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Java is Required
&lt;/h3&gt;

&lt;p&gt;ZooKeeper runs on the JVM. Install it before trying to start ZooKeeper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;default-jdk &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I spent 20 minutes debugging a &lt;code&gt;JAVA_HOME is not set&lt;/code&gt; error before realising Java was never actually installed, only the bash completion for it was.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up ZooKeeper as a Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/zookeeper /var/lib/zookeeper /var/log/zookeeper
&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cp -r /home/ubuntu/apache-zookeeper-3.8.4-bin/* /opt/zookeeper/'&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;lt;&amp;lt;EOF &amp;gt; /opt/zookeeper/conf/zoo.cfg
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
admin.serverPort=3181
EOF'&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;lt;&amp;lt;EOF &amp;gt; /opt/zookeeper/conf/zoo.env
ZOO_LOG_DIR=/var/log/zookeeper
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
EOF'&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;getent passwd zookeeper &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;useradd &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; /opt/zookeeper &lt;span class="nt"&gt;--no-create-home&lt;/span&gt; &lt;span class="nt"&gt;--user-group&lt;/span&gt; &lt;span class="nt"&gt;--shell&lt;/span&gt; /sbin/nologin zookeeper
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; zookeeper:zookeeper /opt/zookeeper /var/lib/zookeeper /var/log/zookeeper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One more gotcha: the &lt;code&gt;zoo.env&lt;/code&gt; file needs &lt;code&gt;JAVA_HOME&lt;/code&gt; set explicitly, otherwise the systemd service can't find Java even if it's in your &lt;code&gt;$PATH&lt;/code&gt;. Add it to the env file, not just your shell.&lt;/p&gt;

&lt;p&gt;Create the systemd service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/systemd/system/zookeeper.service
[Unit]
Description=Zookeeper
Documentation=http://zookeeper.apache.org

[Service]
EnvironmentFile=/opt/zookeeper/conf/zoo.env
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
Type=forking
WorkingDirectory=/opt/zookeeper
User=zookeeper
Group=zookeeper
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
TimeoutSec=30
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF'&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start zookeeper.service
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status zookeeper.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When ZooKeeper is running you'll see &lt;code&gt;Active: active (running)&lt;/code&gt; with a Java process in the CGroup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Configure ClickHouse to Use ZooKeeper
&lt;/h2&gt;

&lt;p&gt;Now start ClickHouse, but first wire it to ZooKeeper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/clickhouse-server/config.d/cluster.xml
&amp;lt;clickhouse replace="true"&amp;gt;
    &amp;lt;distributed_ddl&amp;gt;
        &amp;lt;path&amp;gt;/clickhouse/task_queue/ddl&amp;lt;/path&amp;gt;
    &amp;lt;/distributed_ddl&amp;gt;
    &amp;lt;remote_servers&amp;gt;
        &amp;lt;cluster&amp;gt;
            &amp;lt;shard&amp;gt;
                &amp;lt;replica&amp;gt;
                    &amp;lt;host&amp;gt;127.0.0.1&amp;lt;/host&amp;gt;
                    &amp;lt;port&amp;gt;9000&amp;lt;/port&amp;gt;
                &amp;lt;/replica&amp;gt;
            &amp;lt;/shard&amp;gt;
        &amp;lt;/cluster&amp;gt;
    &amp;lt;/remote_servers&amp;gt;
    &amp;lt;zookeeper&amp;gt;
        &amp;lt;node&amp;gt;
            &amp;lt;host&amp;gt;127.0.0.1&amp;lt;/host&amp;gt;
            &amp;lt;port&amp;gt;2181&amp;lt;/port&amp;gt;
        &amp;lt;/node&amp;gt;
    &amp;lt;/zookeeper&amp;gt;
    &amp;lt;macros&amp;gt;
        &amp;lt;shard&amp;gt;01&amp;lt;/shard&amp;gt;
        &amp;lt;replica&amp;gt;01&amp;lt;/replica&amp;gt;
    &amp;lt;/macros&amp;gt;
&amp;lt;/clickhouse&amp;gt;
EOF'&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;clickhouse:clickhouse /etc/clickhouse-server/config.d/cluster.xml
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start clickhouse-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify ClickHouse is up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clickhouse-client &lt;span class="nt"&gt;--password&lt;/span&gt; password &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"SELECT 1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it returns &lt;code&gt;1&lt;/code&gt;, you're good.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The default ClickHouse install sets the password to &lt;code&gt;password&lt;/code&gt; (SHA256 hashed). Check &lt;code&gt;/etc/clickhouse-server/users.d/default-password.xml&lt;/code&gt; if you get an authentication error.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Run ClickHouse Migrations
&lt;/h2&gt;

&lt;p&gt;Download the SigNoz OTel Collector binary; you need it for migrations before you need it as a service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/SigNoz/signoz-otel-collector/releases/latest/download/signoz-otel-collector_linux_amd64.tar.gz &lt;span class="nt"&gt;-o&lt;/span&gt; signoz-otel-collector.tar.gz
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; signoz-otel-collector.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the three migrations in order, waiting for each to complete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./signoz-otel-collector_linux_amd64/bin/signoz-otel-collector migrate bootstrap &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--clickhouse-dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"tcp://localhost:9000?password=password"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--clickhouse-replication&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;

./signoz-otel-collector_linux_amd64/bin/signoz-otel-collector migrate &lt;span class="nb"&gt;sync &lt;/span&gt;up &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--clickhouse-dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"tcp://localhost:9000?password=password"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--clickhouse-replication&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;

./signoz-otel-collector_linux_amd64/bin/signoz-otel-collector migrate async up &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--clickhouse-dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"tcp://localhost:9000?password=password"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--clickhouse-replication&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If bootstrap fails with &lt;code&gt;DDL background thread is not initialized&lt;/code&gt;, ClickHouse started before ZooKeeper was ready. Restart ClickHouse and try again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Install and Start SigNoz
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/SigNoz/signoz/releases/latest/download/signoz_linux_amd64.tar.gz &lt;span class="nt"&gt;-o&lt;/span&gt; signoz.tar.gz
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; signoz.tar.gz

&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/signoz /var/lib/signoz
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; signoz_linux_amd64/&lt;span class="k"&gt;*&lt;/span&gt; /opt/signoz

&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;lt;&amp;lt;EOF &amp;gt; /opt/signoz/conf/systemd.env
SIGNOZ_INSTRUMENTATION_LOGS_LEVEL=info
INVITE_EMAIL_TEMPLATE=/opt/signoz/templates/invitation_email_template.html
SIGNOZ_SQLSTORE_SQLITE_PATH=/var/lib/signoz/signoz.db
SIGNOZ_WEB_ENABLED=true
SIGNOZ_WEB_DIRECTORY=/opt/signoz/web
SIGNOZ_JWT_SECRET=secret
SIGNOZ_ALERTMANAGER_PROVIDER=signoz
SIGNOZ_TELEMETRYSTORE_PROVIDER=clickhouse
SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://localhost:9000?password=password
DOT_METRICS_ENABLED=true
EOF'&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;getent passwd signoz &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;useradd &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; /opt/signoz &lt;span class="nt"&gt;--no-create-home&lt;/span&gt; &lt;span class="nt"&gt;--user-group&lt;/span&gt; &lt;span class="nt"&gt;--shell&lt;/span&gt; /sbin/nologin signoz
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; signoz:signoz /var/lib/signoz /opt/signoz

&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/systemd/system/signoz.service
[Unit]
Description=SigNoz
After=clickhouse-server.service

[Service]
User=signoz
Group=signoz
Type=simple
KillMode=mixed
Restart=on-failure
WorkingDirectory=/opt/signoz
EnvironmentFile=/opt/signoz/conf/systemd.env
ExecStart=/opt/signoz/bin/signoz server

[Install]
WantedBy=multi-user.target
EOF'&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start signoz.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Health check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET http://localhost:8080/api/v1/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output: &lt;code&gt;{"status":"ok"}&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Install the SigNoz OTel Collector as a Service
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/signoz-otel-collector /var/lib/signoz-otel-collector
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; signoz-otel-collector_linux_amd64/&lt;span class="k"&gt;*&lt;/span&gt; /opt/signoz-otel-collector
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; signoz:signoz /opt/signoz-otel-collector /var/lib/signoz-otel-collector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create &lt;code&gt;/opt/signoz-otel-collector/conf/config.yaml&lt;/code&gt; with your pipeline config (receivers, processors, exporters), then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;lt;&amp;lt;EOF &amp;gt; /opt/signoz-otel-collector/conf/opamp.yaml
server_endpoint: ws://127.0.0.1:4320/v1/opamp
EOF'&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start signoz-otel-collector.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Feature I like most is the services section
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcay5eelyd3dkgb4866n8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcay5eelyd3dkgb4866n8.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Distributed services view showing basic details of each service&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The services feature shows me the app running, the p99 latency, error rate &amp;amp; operations per second. This enables me to know the potential factors that might affect my app running well &amp;amp; foster mitigation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl30uvzezmdrx8zsiigkn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl30uvzezmdrx8zsiigkn.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Span detail showing exact latency breakdown and attributes&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The latency breakdown shows me the flame graph &amp;amp; waterfall, and the most important part is the fields, which enable me to dive deeper into understanding the attributes &amp;amp; other vital metadata of the trace
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Sending Real Data (Demo App)
&lt;/h2&gt;

&lt;p&gt;An empty SigNoz is not very useful. To see traces and logs flowing, run the OpenTelemetry demo app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/SigNoz/opentelemetry-demo-lite
&lt;span class="nb"&gt;cd &lt;/span&gt;opentelemetry-demo-lite
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Within a few minutes, traces from multiple services start appearing in SigNoz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frmfymdb25gidsck8ul5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frmfymdb25gidsck8ul5w.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Traces view showing the demo app's microservices reporting to SigNoz&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flp92ixpeal2t4pkj2j5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flp92ixpeal2t4pkj2j5g.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Tell My Past Self
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;archive.apache.org&lt;/code&gt; instead of &lt;code&gt;dlcdn.apache.org&lt;/code&gt;.&lt;/strong&gt; The CDN only keeps the latest releases. If a version is referenced in docs but returns 404, the archive mirror always has it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JAVA_HOME must be in the systemd EnvironmentFile.&lt;/strong&gt; Your shell's PATH doesn't carry over into systemd services. I lost time on this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start ClickHouse after ZooKeeper is confirmed running.&lt;/strong&gt; If ClickHouse initializes before ZooKeeper is up, the DDL background thread won't start and migrations will fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run commands one at a time.&lt;/strong&gt; I kept having commands concatenate in my terminal — &lt;code&gt;command1\ncommand2&lt;/code&gt; running as a single broken string. Each command on its own line, wait for the prompt, then run the next.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Self-hosting SigNoz is not plug-and-play, but it's absolutely doable on a single Linux server. The four-service stack (ZooKeeper, ClickHouse, SigNoz, OTel Collector) takes about an hour to get right the first time, mostly because of version mismatches and permission issues the docs gloss over.&lt;/p&gt;

&lt;p&gt;Once it's running, Services alone makes it worth the effort because it shows me the app running, the p99 latency, error rate &amp;amp; operations per second.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SigNoz docs: &lt;a href="https://signoz.io/docs" rel="noopener noreferrer"&gt;https://signoz.io/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenTelemetry demo: &lt;a href="https://github.com/SigNoz/opentelemetry-demo-lite" rel="noopener noreferrer"&gt;https://github.com/SigNoz/opentelemetry-demo-lite&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;WeMakeDevs x SigNoz Hackathon: &lt;a href="https://www.wemakedevs.org/hackathons/signoz" rel="noopener noreferrer"&gt;https://www.wemakedevs.org/hackathons/signoz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Written as part of the WeMakeDevs x SigNoz "Agents of SigNoz" hackathon, July 2026.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
