Monitoring Nginx Logs with ClickStack
This guide shows you how to monitor nginx with ClickStack by configuring the OpenTelemetry collector to ingest nginx access logs. You'll learn how to:
- Configure nginx to output JSON-formatted logs
- Create a custom OTel collector configuration for log ingestion
- Deploy ClickStack with your custom configuration
- Use a pre-built dashboard to visualize nginx metrics (requests, errors, latency)
A demo dataset with 10,000 sample logs is provided to test the integration before connecting your production nginx instances.
Time Required: 5-10 minutes.
Prerequisites
- ClickStack instance running
- Existing nginx installation
- Access to modify nginx configuration files
Integration with existing nginx
This section covers configuring your existing nginx installation to send logs to ClickStack by modifying the ClickStack OTel collector configuration.
Configure nginx log format
First, configure nginx to output logs in JSON format for easier parsing. Add this log format definition to your nginx.conf:
The nginx.conf file is typically located at:
- Linux (apt/yum):
/etc/nginx/nginx.conf - macOS (Homebrew):
/usr/local/etc/nginx/nginx.confor/opt/homebrew/etc/nginx/nginx.conf - Docker: Configuration is usually mounted as a volume
Add this log format definition to the http block:
After making this change, reload nginx.
Create custom otel collector configuration
ClickStack allows you to extend the base OpenTelemetry Collector configuration by mounting a custom configuration file and setting an environment variable. The custom configuration is merged with the base configuration managed by HyperDX via OpAMP.
Create a file named nginx-monitoring.yaml with the following configuration:
This configuration:
- Reads nginx logs from their standard locations
- Parses JSON log entries
- Extracts and preserves the original log timestamps
- Adds source: nginx attribute for filtering in HyperDX
- Routes logs to the ClickHouse exporter via a dedicated pipeline
- You only define new receivers and pipelines in the custom config
- The processors (memory_limiter, transform, batch) and exporters (clickhouse) are already defined in the base ClickStack configuration - you just reference them by name
- The time_parser operator extracts timestamps from nginx's time_local field to preserve original log timing
- The pipelines route data from your receivers to the ClickHouse exporter via the existing processors
Configure ClickStack to load custom configuration
To enable custom collector configuration in your existing ClickStack deployment, you must:
- Mount the custom config file at /etc/otelcol-contrib/custom.config.yaml
- Set the environment variable CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yaml
- Mount your nginx log directories so the collector can read them
Option 1: Docker Compose
Update your ClickStack deployment configuration:
Option 2: Docker Run (All-in-One Image)
If using the all-in-one image with docker run:
Ensure the ClickStack collector has appropriate permissions to read the nginx log files. In production, use read-only mounts (:ro) and follow the principle of least privilege.
Verifying Logs in ClickStack
Once configured, log into HyperDX and verify logs are flowing:
- Navigate to the Logs view
- Verify you see JSON-parsed log entries with fields like request, request_time, upstream_response_time, etc.
This is an example of what you should see:
Demo dataset
For users who want to test the nginx integration before configuring their production systems, we provide a sample dataset of pre-generated nginx access logs with realistic traffic patterns.
Download the sample dataset
Download the sample log file and update timestamps to the current time:
The dataset includes:
- 10,000 log entries with realistic traffic patterns
- Various endpoints and HTTP methods
- Mix of successful requests and errors
- Realistic response times and byte counts
- Timestamps now distributed over recent time
Create test collector configuration
Create a file named nginx-demo.yaml with the following configuration:
Verify logs in HyperDX
Once ClickStack is running (you may have to create an account and login first):
- Open HyperDX
It is important to use the link above to get the correct time range, if you don't use this link set your time range to Oct 20 11:00:00 - Oct 21 11:00:00 to see proper results.
Here's what you should see in your search view:
Dashboards and visualization
To help you get started monitoring nginx with ClickStack, we provide essential visualizations for nginx logs.
Import Pre-built Dashboard
- Open HyperDX and navigate to the Dashboards section.
- Click "Import Dashboard" in the upper right corner under the ellipses.
- Upload the nginx-logs-dashboard.json file and click finish import.
The dashboard will be created with all visualizations pre-configured.
Troubleshooting
Custom config not loading
- Verify the environment variable CUSTOM_OTELCOL_CONFIG_FILE is set correctly
- Check that the custom config file is mounted at /etc/otelcol-contrib/custom.config.yaml
- View the custom config content to verify it's readable
No logs appearing in HyperDX
- Ensure nginx is writing JSON logs
- Check the collector can read the logs
- Verify the effective config includes your filelog receiver
- Check for errors in the collector logs
Next Steps
If you want to explore further, here are some next steps to experiment with your dashboard
- Set up alerts for critical metrics (error rates, latency thresholds)
- Create additional dashboards for specific use cases (API monitoring, security events)