For the complete documentation index, see llms.txt. Markdown versions are available by appending .md to documentation URLs.

Monitor HTTP Endpoints - Uptime & TLS Expiry Tracking

SigNoz Cloud - This page applies to SigNoz Cloud editions.
Self-Host - This page applies to self-hosted SigNoz editions.

Overview

The OpenTelemetry Collector can probe an HTTP endpoint on a schedule and report the result as metrics. This gives you uptime monitoring for any HTTP or HTTPS URL, without an agent inside the application.

With this guide you can:

  • Probe your endpoints on a schedule and record whether they respond.
  • See endpoint health, latency, and response size in a SigNoz dashboard.
  • Get an alert when an endpoint stops responding.
  • Track TLS certificate expiry.
  • Catch a 200 response that carries an error body.

The checks run from the Collector host. Each measurement covers the network path from that host to the endpoint, not the path your users take. Run the Collector outside the network that hosts the endpoint to measure user-facing uptime. Run it inside that network to measure internal reachability.

Prerequisites

  • A server or virtual machine to run the OpenTelemetry Collector. The checks run from this host.
  • Network access from the Collector host to each endpoint that you want to monitor.

Setup

Step 1: Install the OpenTelemetry Collector

Install the Collector on your server with the Collector installation guide. That guide covers Docker, Kubernetes, VM, and AWS ECS.

Step 2: Add the HTTP Check Receiver

The HTTP Check Receiver sends a request to each target on a schedule. It records the response as metrics.

Add this receiver to your Collector configuration file:

otel-collector-config.yaml
receivers:
  # On Collector v0.150.0 and newer, use "http_check" to avoid a deprecation warning.
  httpcheck:
    targets:
      - endpoint: https://<your-endpoint>
        method: GET
    collection_interval: 60s

Verify these values:

  • <your-endpoint>: The URL to monitor, for example api.example.com/health.
  • method: The HTTP method. Use GET for most health checks.
  • collection_interval: How often to run the check. Use 30s for critical endpoints.

Step 3: Enable the Optional Metrics

The receiver enables three metrics by default: httpcheck.status, httpcheck.duration, and httpcheck.error. Certificate expiry, response size, and the per-phase timings are off until you turn them on. The dashboard in this guide reads all of them, so enable them now.

Add the metrics block to the receiver you created in Step 2:

otel-collector-config.yaml
receivers:
  httpcheck:
    metrics:
      httpcheck.tls.cert_remaining:
        enabled: true
      httpcheck.response.size:
        enabled: true
      httpcheck.dns.lookup.duration:
        enabled: true
      httpcheck.client.connection.duration:
        enabled: true
      httpcheck.tls.handshake.duration:
        enabled: true
      httpcheck.client.request.duration:
        enabled: true
      httpcheck.response.duration:
        enabled: true

What each one gives you:

MetricWhat you get
httpcheck.tls.cert_remainingSeconds left on each verified certificate
httpcheck.response.sizeResponse body size, which drops when an error page replaces the real response
The five duration metricsWhich phase is slow: DNS, TCP connect, TLS handshake, request write, response read

Step 4: Add the SigNoz Exporter

If you followed the Collector installation guide, the exporter already exists. Go to Step 5.

Otherwise, add the OTLP exporter:

otel-collector-config.yaml
exporters:
  otlp:
    endpoint: "ingest.<region>.signoz.cloud:443"
    tls:
      insecure: false
    headers:
      "signoz-ingestion-key": "<your-ingestion-key>"

Verify these values:

Step 5: Add the Processor and the Uptime Pipeline

The receiver sets no resource attributes. Without a resource processor, the metrics arrive with no service name and attach to no service in SigNoz.

Give the checks their own metrics pipeline. In a shared pipeline, resource/uptime also processes your application metrics, and action: upsert overwrites the service.name that those metrics already carry.

otel-collector-config.yaml
processors:
  resource/uptime:
    attributes:
      - key: service.name
        value: <service-name>
        action: upsert
 
service:
  pipelines:
    metrics/uptime:
      receivers: [httpcheck]
      processors: [resource/uptime, batch]
      exporters: [otlp]

Verify these values:

  • <service-name>: The name to group these checks under in SigNoz, for example uptime-monitor.

Step 6: Restart the Collector

Restart the Collector to apply the changes. The command depends on how you deployed it. See the Collector installation guide.

Validate

Wait for one collection_interval, then open Metrics in SigNoz and search for httpcheck.

httpcheck metrics listed in the SigNoz Metrics explorer with their type and unit
httpcheck metrics in the Metrics explorer, with the type and unit of each metric

If httpcheck.status and httpcheck.duration appear, the checks work.

Import the Uptime Monitoring Dashboard

Import the dashboard before you set up alerts, because the alert flow starts from a dashboard panel.

Get the JSON and the import steps from the Uptime Monitoring dashboard page. Then set the Service variable at the top of the dashboard to the <service-name> you chose in Step 5.

Set Up Alerts

Step 1: Create an Alert from a Dashboard Panel

  1. Open the Availability by Endpoint panel in the Uptime Monitoring dashboard.
  2. Click the dropdown menu (â‹®).
  3. Select Create Alerts.
Creating an alert from the dashboard panel dropdown menu
Create an alert directly from a dashboard panel

Step 2: Configure the Availability Alert

Set the alert to fire when an endpoint stops returning 2xx responses:

Alert configuration page showing conditions for HTTP endpoint monitoring
Alert configuration that fires when an endpoint stops responding
Metric: httpcheck.status
WHERE: http.status_class = 2xx
Avg By: http.url
Condition: below the threshold at least once during the last 5 mins
Threshold: 1

This alert fires when an endpoint returns no 2xx response even once in 5 minutes. Send it to Slack, PagerDuty, email, or another notification channel.

Step 3: Add a Certificate Expiry Alert

Create a second alert on httpcheck.tls.cert_remaining so no certificate expires without warning:

Metric: httpcheck.tls.cert_remaining
Avg By: http.url
Condition: below the threshold at least once during the last 30 mins
Threshold: 1209600

A threshold of 1209600 seconds gives you 14 days of notice. A negative value means the certificate already expired.

Catch a 200 That Lies

A 200 response does not prove the endpoint works. A service can return HTTP 200 with an error page or a stale payload, and every reachability signal stays green. Response validation asserts on the body, so those cases surface.

Add validations to a target and enable the two validation metrics:

otel-collector-config.yaml
receivers:
  httpcheck:
    metrics:
      httpcheck.validation.passed:
        enabled: true
      httpcheck.validation.failed:
        enabled: true
    targets:
      - endpoint: https://<your-endpoint>
        method: GET
        validations:
          - contains: '"status":"ok"'
          - not_contains: '"status":"error"'
          - min_size: 10

Each assertion reports its outcome with a validation.type attribute, so you can tell which check failed:

Assertionvalidation.typeUse it to
contains / not_containscontains / not_containsRequire or forbid a string in the body
json_path with equalsjson_pathCompare a JSON field, for example $.status equals ok
min_size / max_sizesizeCatch truncated or unexpectedly large bodies
regexregexMatch a pattern

Then add the Validation Failures by Endpoint and Check panel of the dashboard to your review. A row whose status code is 2xx is a silent failure.

Monitor Multiple Endpoints

One target accepts a list of URLs under endpoints. Use it when every URL shares the same method and interval:

otel-collector-config.yaml
receivers:
  httpcheck:
    targets:
      - method: GET
        endpoints:
          - https://api.example.com/health
          - https://api.example.com/ready
          - https://internal-service.local:8080/ping
    collection_interval: 60s

Use Different Check Intervals

To check some endpoints more often than others, add a second receiver instance. Use the format httpcheck/<name>:

otel-collector-config.yaml
receivers:
  httpcheck/critical:
    targets:
      - method: GET
        endpoint: https://api.example.com/health
    collection_interval: 30s
 
  httpcheck/standard:
    targets:
      - method: GET
        endpoints:
          - https://blog.example.com
          - https://docs.example.com
    collection_interval: 300s

Then add both instances to the uptime pipeline:

otel-collector-config.yaml
service:
  pipelines:
    metrics/uptime:
      receivers: [httpcheck/critical, httpcheck/standard]
      processors: [resource/uptime, batch]
      exporters: [otlp]

Probe an Endpoint That Needs Auth or a Body

Each target takes the client options of the Collector HTTP client, so you can send headers. Targets also take a request body for POST, PUT, and PATCH:

otel-collector-config.yaml
receivers:
  httpcheck:
    targets:
      - endpoint: https://<your-endpoint>
        method: GET
        headers:
          Authorization: "Bearer <your-token>"
      - endpoint: https://api.example.com/users
        method: POST
        body: '{"name": "probe"}'
    collection_interval: 60s

The receiver sets Content-Type from the body when you set no header for it. A body that starts with { or [ gets application/json. A body that contains = gets application/x-www-form-urlencoded. Any other body gets text/plain.

Metrics and Attributes Reference

For the full upstream specification, see the HTTP Check Receiver metric documentation.

Default Metrics (always enabled)

MetricDescriptionUnit
httpcheck.status1 if the check resulted in a status code matching the status class, 0 otherwise1
httpcheck.durationTotal duration of the HTTP checkms
httpcheck.errorRecorded only when a probe fails before it gets a response, for example connection refused, DNS failure, or timeout{error}

Optional Metrics (must be enabled in config)

MetricDescriptionUnit
httpcheck.dns.lookup.durationTime spent performing DNS lookupns
httpcheck.client.connection.durationTime spent establishing TCP connectionns
httpcheck.tls.handshake.durationTime spent performing TLS handshakens
httpcheck.client.request.durationTime spent sending the HTTP requestns
httpcheck.response.durationTime spent receiving the HTTP responsens
httpcheck.response.sizeSize of response body, recorded only when the body has at least one byteBy (bytes)
httpcheck.tls.cert_remainingTime until TLS certificate expires, as specified by NotAfter field in the x.509 certificate. Negative values mean the certificate has already expireds (seconds)
httpcheck.validation.failedNumber of response validations that failed{validation}
httpcheck.validation.passedNumber of response validations that passed{validation}

Key Attributes

Attributes vary by metric. The table below shows all attributes and which metrics they apply to:

AttributeDescriptionApplies To
http.urlFull HTTP request URLAll metrics
http.status_codeHTTP response status codehttpcheck.status
http.methodHTTP request methodhttpcheck.status
http.status_classHTTP response status class (1xx through 5xx)httpcheck.status
error.messageError message recorded during checkhttpcheck.error
network.transportOSI transport layer protocolhttpcheck.client.connection.duration
http.tls.issuerCertificate issuerhttpcheck.tls.cert_remaining
http.tls.cnCertificate common name (CN)httpcheck.tls.cert_remaining
http.tls.sanCertificate Subject Alternative Namehttpcheck.tls.cert_remaining
validation.typeType of validation (contains, json_path, size, regex)httpcheck.validation.failed, httpcheck.validation.passed

Troubleshooting

No httpcheck metrics appear in SigNoz

Symptoms: You configured the receiver, but no httpcheck.* metric appears in SigNoz.

Causes and fixes:

  1. Receiver not in the pipeline: Make sure that httpcheck is listed under service.pipelines.metrics/uptime.receivers.
  2. Configuration file not loaded: Make sure that the Collector starts with the correct file. Read the startup logs for errors.
  3. Collector not restarted: Restart the Collector after you change the configuration.

The checks arrive with no service name

Symptoms: httpcheck.* metrics exist, but the dashboard Service variable is empty.

Causes and fixes:

  1. Processor missing from the pipeline: Make sure that resource/uptime is listed under the processors of metrics/uptime. The receiver sets no resource attributes of its own.
  2. Second receiver instance on another pipeline: Every httpcheck/<name> instance needs the same processor. See Use Different Check Intervals.

Application metrics changed service name after this setup

Symptoms: Services that reported before now appear under the uptime service name.

Causes and fixes:

  1. Shared pipeline: resource/uptime uses action: upsert, which overwrites service.name on every metric in its pipeline. Move httpcheck and resource/uptime to their own metrics/uptime pipeline, as shown in Step 5.

Connection refused or timeout errors in Collector logs

Symptoms: The Collector logs show connection refused or context deadline exceeded for an endpoint.

Causes and fixes:

  1. Network access: Make sure that the Collector host can reach the endpoint. Do a test with curl <endpoint> from the same host.
  2. Firewall rules: Make sure that firewalls and security groups permit outbound traffic to the endpoint.
  3. DNS resolution: If you use a hostname, do a test with nslookup <hostname> from the Collector host.

Validation reports neither a pass nor a failure

Symptoms: A target has validations and both validation metrics are enabled, but neither metric reports data for that endpoint.

Causes and fixes:

  1. Empty response body: The receiver skips every assertion when the body has zero bytes, so a 200 with an empty body produces no data point. Alert on httpcheck.validation.passed falling to 0, not only on failures rising.
  2. Assertions on the wrong target: validations is a per-target key. Add it to each target you want to assert on.

SSL/TLS errors for HTTPS endpoints

Symptoms: The Collector logs show a TLS handshake error or a certificate error.

Causes and fixes:

  1. Self-signed certificates: If the endpoint uses a self-signed certificate, skip verification. Do not use this in production.
    receivers:
      httpcheck:
        targets:
          - endpoint: https://internal-service.local
            tls:
              insecure_skip_verify: true
  2. Expired certificates: The certificate can be expired. Do a test with openssl s_client -connect <host>:443.

Metrics not reaching SigNoz Cloud

Symptoms: The debug logs show successful checks, but no metric appears in SigNoz.

Causes and fixes:

  1. Incorrect ingestion key: Make sure that the signoz-ingestion-key header is correct. Get your key from SigNoz Cloud settings.
  2. Wrong region: Make sure that <region> matches your SigNoz Cloud region. See available regions.
  3. Exporter name mismatch: The name under exporters must match the name in service.pipelines.metrics/uptime.exporters.

Next Steps

Get Help

If you need help with the steps in this topic, please reach out to us on SigNoz Community Slack. If you are a SigNoz Cloud user, please use in product chat support located at the bottom right corner of your SigNoz instance or contact us at cloud-support@signoz.io.

Is this page helpful

Last updated—August 22, 2026

Edit on GitHub