Environment
- OS: Ubuntu (snap docker)
-
Docker path:
/var/snap/docker/common/var-lib-docker/ -
SigNoz path:
/root/signoz/ - SigNoz version: v0.117.1
- ClickHouse version: 25.5.6
- CPU: No AVX2 support (important — affects configuration)
1. Install SigNoz
cd /root
git clone -b main https://github.com/SigNoz/signoz.git
cd signoz/deploy/docker
2. Fix ClickHouse — Disable simdjson (REQUIRED for CPUs without AVX2)
CPUs without AVX2 will encounter CANNOT_ALLOCATE_MEMORY errors when SigNoz queries metrics via JSONExtractString.
Check if your CPU supports AVX2:
grep -o 'avx2' /proc/cpuinfo | head -1
# No output = no AVX2 support → apply the fix below
Edit /root/signoz/deploy/common/clickhouse/users.xml and add <allow_simdjson>0</allow_simdjson> to the default profile:
<profiles>
<default>
<max_memory_usage>10000000000</max_memory_usage>
<allow_simdjson>0</allow_simdjson> <!-- Fix for CPUs without AVX2 -->
<load_balancing>random</load_balancing>
</default>
...
</profiles>
Why this happens
ClickHouse uses the simdjson library for JSON parsing functions (JSONExtractString, etc.). Starting from ClickHouse 24.1+, simdjson requires AVX2 CPU instructions. On CPUs without AVX2, any query using JSONExtractString on the distributed_time_series_v4 table throws:
Code: 173. DB::Exception: Couldn't allocate N bytes when parsing JSON
Setting allow_simdjson=0 forces ClickHouse to fall back to rapidjson, which does not require AVX2.
This affects:
- Infrastructure → Hosts tab (returns 500 error)
- Any dashboard querying metrics with label filters
3. Disable ClickHouse System Logs (REQUIRED — prevent disk exhaustion)
By default, ClickHouse writes internal diagnostic logs (trace_log, metric_log, etc.) that can grow to 70GB+ over time.
Create /root/signoz/deploy/common/clickhouse/z_log_disable.xml:
<?xml version="1.0"?>
<clickhouse>
<asynchronous_metric_log remove="1"/>
<trace_log remove="1"/>
<metric_log remove="1"/>
<query_views_log remove="1"/>
<query_thread_log remove="1"/>
<part_log remove="1"/>
<processors_profile_log remove="1"/>
<opentelemetry_span_log remove="1"/>
</clickhouse>
The
z_prefix ensures this file is loaded last (configs are applied alphabetically), overriding any previous settings.
Mount this file into the ClickHouse container in /root/signoz/deploy/docker/docker-compose.yaml:
clickhouse:
volumes:
- ../common/clickhouse/config.xml:/etc/clickhouse-server/config.xml
- ../common/clickhouse/users.xml:/etc/clickhouse-server/users.xml
- ../common/clickhouse/custom-function.xml:/etc/clickhouse-server/custom-function.xml
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
- ../common/clickhouse/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
- ../common/clickhouse/ttl.xml:/etc/clickhouse-server/config.d/ttl.xml
- ../common/clickhouse/z_log_disable.xml:/etc/clickhouse-server/config.d/z_log_disable.xml # ADD THIS LINE
- clickhouse:/var/lib/clickhouse/
4. Configure SMTP for Email Alerts
Add the following environment variables to the signoz service in docker-compose.yaml:
signoz:
environment:
- SIGNOZ_ALERTMANAGER_PROVIDER=signoz
- SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://clickhouse:9000
- SIGNOZ_SQLSTORE_SQLITE_PATH=/var/lib/signoz/signoz.db
# SMTP configuration
- SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__FROM=your-email@gmail.com
- SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__SMARTHOST=smtp.gmail.com:587
- SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__AUTH__USERNAME=your-email@gmail.com
- SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__AUTH__PASSWORD=your-16-char-app-password
Gmail note: You must use an App Password, not your regular Gmail password.
Generate one at: https://myaccount.google.com/apppasswords
The App Password is 16 characters — remove all spaces before using it.Important: The correct variable names use the
SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__prefix with double underscores. UsingSIGNOZ_ALERTMANAGER_SMTP_*(withoutSIGNOZ_GLOBAL) will not work.
5. Start SigNoz
cd /root/signoz/deploy/docker
docker compose up -d
Verify all containers are healthy:
docker compose ps
Verify ClickHouse system logs are disabled:
docker exec signoz-clickhouse clickhouse-client --query "
SELECT name FROM system.tables
WHERE database='system' AND name LIKE '%log%'
ORDER BY name"
# Only query_log should remain
6. Setup Host Metrics Monitoring (Infrastructure Tab)
Run an otel-collector agent on the main application server:
6.1 Create config file on the main server
mkdir -p /opt/otel-agent
cat > /opt/otel-agent/config.yaml << 'EOF'
receivers:
hostmetrics:
root_path: /hostfs
collection_interval: 60s
scrapers:
cpu: {}
disk: {}
load: {}
filesystem:
exclude_mount_points:
mount_points: [/snap/*, /boot/efi]
match_type: regexp
memory: {}
network: {}
paging: {}
processes: {}
processors:
batch:
resourcedetection:
detectors: [env, system]
system:
hostname_sources: [os]
resource/env:
attributes:
- key: deployment.environment
value: production
action: upsert
exporters:
otlp:
endpoint: "<SIGNOZ_MONITOR_SERVER_IP>:4317"
tls:
insecure: true
extensions:
health_check:
service:
extensions: [health_check]
pipelines:
metrics:
receivers: [hostmetrics]
processors: [resourcedetection, resource/env, batch]
exporters: [otlp]
EOF
Replace <SIGNOZ_MONITOR_SERVER_IP> with your SigNoz monitor server IP.
6.2 Run the container
docker run -d \
--name otel-agent \
--restart unless-stopped \
--hostname navio-main-server \
-v /opt/otel-agent/config.yaml:/etc/otelcol-contrib/config.yaml \
-v /:/hostfs:ro \
-e HOST_PROC=/hostfs/proc \
-e HOST_SYS=/hostfs/sys \
-e HOST_ETC=/hostfs/etc \
-e HOST_VAR=/hostfs/var \
-e HOST_RUN=/hostfs/run \
-e HOST_DEV=/hostfs/dev \
otel/opentelemetry-collector-contrib:latest
After a few minutes, the host should appear in SigNoz UI → Infrastructure → Hosts.
7. Create Disk Usage Alert (> 80%)
Go to SigNoz UI → Alerts → New Alert → Metric Based Alert:
Query A (used disk):
- Metric:
system.filesystem.usage - Filter:
state = used AND host.name = <your-hostname> - Time aggregation:
avg, Space aggregation:sum
Query B (total disk — all states):
- Metric:
system.filesystem.usage - Filter:
host.name = <your-hostname> - Time aggregation:
avg, Space aggregation:sum
Formula F1: A / B * 100
Condition:
- Warning: above
80 - Critical: above
90 - Evaluation window: last
5 min
Annotations:
Alert: Disk usage has exceeded {{$threshold}}% (current: {{$value}}%)
8. Routine Maintenance
# Check disk usage on monitor server
df -h /
# Verify ClickHouse system logs are not growing
docker exec signoz-clickhouse clickhouse-client --query "
SELECT table, formatReadableSize(sum(bytes_on_disk)) as size
FROM system.parts
WHERE database = 'system'
GROUP BY table
ORDER BY sum(bytes_on_disk) DESC"
# Clean up unused Docker images on main server
docker image prune -af
# Check Docker disk usage
docker system df
9. Troubleshooting
ClickHouse disk full due to system logs
# Enter clickhouse-client
docker exec -it signoz-clickhouse clickhouse-client
# Create force drop flag (run in a separate terminal)
docker exec signoz-clickhouse bash -c \
"touch /var/lib/clickhouse/flags/force_drop_table && \
chmod 666 /var/lib/clickhouse/flags/force_drop_table"
# Truncate all large log tables
TRUNCATE TABLE system.trace_log;
TRUNCATE TABLE system.metric_log;
TRUNCATE TABLE system.query_log;
TRUNCATE TABLE system.processors_profile_log;
TRUNCATE TABLE system.part_log;
TRUNCATE TABLE system.asynchronous_metric_log;
TRUNCATE TABLE system.query_views_log;
Infrastructure Hosts tab returns 500 error
Root cause: CPU does not support AVX2 instructions.
# Check AVX2 support
grep -o 'avx2' /proc/cpuinfo | head -1
# No output = no AVX2
Fix: Add <allow_simdjson>0</allow_simdjson> to ClickHouse users.xml as described in Section 2.
otel-agent not sending data
docker logs otel-agent 2>&1 | tail -20
# Check that host.name is detected correctly
# Check that the endpoint IP is correct
This article was originally published by DEV Community and written by Anh Hai Newton.
Read original article on DEV Community