npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

astro-opentelemetry-integration

v0.1.1

Published

An Open Telemetry integration for Astro.

Readme

Astro OpenTelemetry Integration

npm version

An Astro integration that provides comprehensive OpenTelemetry observability for your Astro site running on Node.js. This integration automatically instruments your application with metrics, traces, and logs, supporting multiple exporters including Prometheus, OTLP (HTTP/gRPC), and console output.


Features

  • Automatic HTTP instrumentation: Tracks request count, duration, and server response metrics
  • Multiple exporter support: Prometheus, OTLP (HTTP/gRPC/Proto), and console exporters
  • Comprehensive metrics: HTTP requests, durations, and host-level system metrics
  • Distributed tracing: Full request tracing with automatic span creation
  • Flexible configuration: Environment variables and programmatic configuration
  • Zero-config defaults: Works out of the box with sensible defaults
  • Auto-instrumentation: Automatic Node.js instrumentation for comprehensive observability

Requirements

  • This integration currently requires the @astrojs/node adapter. OpenTelemetry metrics and traces require a persistent Node.js server process to aggregate and export telemetry data.
  • Not supported: Serverless adapters (such as Vercel, Netlify, Cloudflare, etc.) are not compatible with this integration. In serverless environments, each request runs in isolation, so telemetry cannot be aggregated across requests.

Note: If you deploy to a serverless platform, telemetry will not be accurate or useful, as each request is handled by a separate, stateless server instance.

Future Support

Future versions of this integration will add support for:

  • Deno adapter: Full OpenTelemetry support for Deno-based Astro applications
  • Serverless environments: Optimized telemetry collection for serverless deployments

Installation

Automatic (Recommended)

pnpm astro add astro-opentelemetry-integration @astrojs/node
# or
npx astro add astro-opentelemetry-integration @astrojs/node
# or
yarn astro add astro-opentelemetry-integration @astrojs/node

Manual

  1. Install the packages:
pnpm add astro-opentelemetry-integration @astrojs/node
# or
npm install astro-opentelemetry-integration @astrojs/node
# or
yarn add astro-opentelemetry-integration @astrojs/node
  1. Add the integration to your astro.config.mjs or astro.config.mts:
import { defineConfig } from "astro/config";
import node from "@astrojs/node";
import otelIntegration from "astro-opentelemetry-integration";

export default defineConfig({
  integrations: [
    otelIntegration(),
  ],
  adapter: node({
    mode: "standalone",
  }),
});

Usage

Prerequisite

Configure the SDK to send metrics to your collector with the OTEL_EXPORTER_OTLP_ENDPOINT environment variable.

OTEL_EXPORTER_OTLP_ENDPOINT="http://your-collector.example.com:4317" node ./dist/server/entry.mjs"

or in your package.json

"scripts": {
  "dev": "OTEL_EXPORTER_OTLP_ENDPOINT=\"http://your-collector.example.com:4317\" astro dev",
}

More information https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/

Minimal Example

// astro.config.mjs or astro.config.mts
import { defineConfig } from "astro/config";
import node from "@astrojs/node";
import otelIntegration from "astro-opentelemetry-integration";

export default defineConfig({
  integrations: [
    otelIntegration(),
  ],
  adapter: node({
    mode: "standalone",
  }),
});

Advanced Example

import { defineConfig } from "astro/config";
import node from "@astrojs/node";
import otelIntegration from "astro-opentelemetry-integration";

export default defineConfig({
  integrations: [
    otelIntegration({
      enabled: true, // Enable/disable integration
      otel: {
        serviceName: "my-astro-app",
        serviceVersion: "1.0.0",
      },
      presets: {
        metricExporter: "prometheus", // or "http", "grpc", "proto", "none"
        traceExporter: "http", // or "grpc", "proto", "console"
        prometheusConfig: {
          host: "0.0.0.0",
          port: 9464,
          endpoint: "/metrics",
          prefix: "myapp_",
          appendTimestamp: true,
          withResourceConstantLabels: "/service/",
        },
      },
    }),
  ],
  adapter: node({
    mode: "standalone",
  }),
});

Default Configuration

When you set up the integration with an empty configuration (otelIntegration()), it uses these defaults:

{
  enabled: true,
  otel: {
    serviceName: "unknown_service",
    serviceVersion: "unknown_version"
  },
  presets: {
    metricExporter: "none",        // No metrics exported by default
    traceExporter: "console",      // Traces output to console
    prometheusConfig: {
      host: "0.0.0.0",
      port: 9464,
      endpoint: "/metrics",
      prefix: "metrics",
      appendTimestamp: true,
      withResourceConstantLabels: "/service/"
    }
  }
}

This means:

  • Metrics: Disabled by default (no metrics collection)
  • Traces: Enabled with console output (visible in your terminal)
  • Service Info: Uses generic service name and version
  • Prometheus: Ready to use but not active until metricExporter: "prometheus" is set

To enable metrics collection, you need to explicitly configure an exporter:

otelIntegration({
  presets: {
    metricExporter: "prometheus"  // Enable Prometheus metrics
  }
})

Configuration Options

| Option | Type | Default | Description | |--------|------|---------|-------------| | enabled | boolean | true | Enable or disable the integration. Useful for disabling in development. | | otel | object | {} | OpenTelemetry service configuration. | | presets | object | {} | Exporter and instrumentation presets. |

otel Configuration

| Option | Type | Default | Description | |--------|------|---------|-------------| | serviceName | string | "unknown_service" | The name of the service for telemetry identification. | | serviceVersion | string | "unknown_version" | The version of the service. |

presets Configuration

| Option | Type | Default | Description | |--------|------|---------|-------------| | metricExporter | string | "none" | The metric exporter to use. Options: "prometheus", "http", "grpc", "proto", "none". | | traceExporter | string | "console" | The trace exporter to use. Options: "http", "grpc", "proto", "console". | | prometheusConfig | object | {} | Configuration for the Prometheus exporter. |

prometheusConfig Configuration

| Option | Type | Default | Description | |--------|------|---------|-------------| | host | string | "0.0.0.0" | The host to listen on for the Prometheus metrics server. | | port | number | 9464 | The port to listen on for the Prometheus metrics server. | | endpoint | string | "/metrics" | The endpoint path for metrics exposure. | | prefix | string | "metrics" | The prefix to use for all metric names. | | appendTimestamp | boolean | true | Whether to append timestamps to metrics. | | withResourceConstantLabels | string | "/service/" | Regular expression for resource constant labels. |


Environment Variables

You can configure the integration using environment variables instead of or in addition to the configuration object. This integration supports both custom environment variables and standard OpenTelemetry environment variables.

Integration-Specific Variables

| Environment Variable | Description | Default | |---------------------|-------------|---------| | OTEL_SERVICE_NAME | Service name for telemetry | "unknown_service" | | OTEL_SERVICE_VERSION | Service version | "unknown_version" | | OTEL_PROMETHEUS_PORT | Prometheus exporter port | 9464 | | OTEL_PROMETHEUS_ENDPOINT | Prometheus metrics endpoint | "/metrics" | | OTEL_PROMETHEUS_HOST | Prometheus exporter host | "0.0.0.0" | | OTEL_PROMETHEUS_PREFIX | Prometheus metrics prefix | "metrics" | | OTEL_PROMETHEUS_APPEND_TIMESTAMP | Append timestamp to metrics | "true" | | OTEL_PROMETHEUS_RESOURCE_LABELS | Resource constant labels regex | "/service/" |

Standard OpenTelemetry Variables

The integration also supports standard OpenTelemetry environment variables:

General Configuration

| Environment Variable | Description | Default | Example | |---------------------|-------------|---------|---------| | OTEL_RESOURCE_ATTRIBUTES | Key-value pairs as resource attributes | - | "key1=value1,key2=value2" |

Tracing Configuration

| Environment Variable | Description | Default | Accepted Values | |---------------------|-------------|---------|-----------------| | OTEL_TRACES_SAMPLER | Sampler used to sample traces | "parentbased_always_on" | "always_on", "always_off", "traceidratio", "parentbased_always_on", "parentbased_always_off", "parentbased_traceidratio" | | OTEL_TRACES_SAMPLER_ARG | Arguments for the sampler (e.g., sampling rate) | - | "0.1" (for traceidratio) | | OTEL_PROPAGATORS | Propagators to be used (comma-separated) | "tracecontext,baggage" | "tracecontext", "baggage", "b3", "b3multi", "jaeger", "xray", "ottrace", "none" |

OTLP Endpoint Configuration

| Environment Variable | Description | Default | Example | |---------------------|-------------|---------|---------| | OTEL_EXPORTER_OTLP_ENDPOINT | General OTLP endpoint for both traces and metrics | "http://localhost:4317" (gRPC), "http://localhost:4318" (HTTP) | "https://api.honeycomb.io:443" | | OTEL_EXPORTER_OTLP_TRACES_ENDPOINT | Specific endpoint for trace data | "http://localhost:4317" (gRPC), "http://localhost:4318/v1/traces" (HTTP) | "https://api.honeycomb.io:443/v1/traces" | | OTEL_EXPORTER_OTLP_METRICS_ENDPOINT | Specific endpoint for metric data | "http://localhost:4317" (gRPC), "http://localhost:4318/v1/metrics" (HTTP) | "https://api.honeycomb.io:443/v1/metrics" | | OTEL_EXPORTER_OTLP_PROTOCOL | Protocol to use for OTLP export | "grpc" | "http/protobuf", "grpc" |

Metrics Configuration

| Environment Variable | Description | Default | Accepted Values | |---------------------|-------------|---------|-----------------| | OTEL_METRICS_EXEMPLAR_FILTER | Determines which measurements can become exemplars | "trace_based" | "always_on", "always_off", "trace_based" | | OTEL_METRIC_EXPORT_INTERVAL | Time interval (ms) between export attempts | 60000 | "30000" | | OTEL_METRIC_EXPORT_TIMEOUT | Maximum time (ms) to export data | 30000 | "15000" |

Advanced Configuration

| Environment Variable | Description | Example | |---------------------|-------------|---------| | OTEL_EXPERIMENTAL_CONFIG_FILE | Path to configuration file | "/path/to/config.yaml" |

For more details, see the OpenTelemetry Environment Variable Specification.


Metrics Provided

The integration provides the following OpenTelemetry metrics:

| Metric Name | Type | Labels | Description | |-------------|------|--------|-------------| | http_requests_total | Counter | method, path, status | Total number of HTTP requests received. | | http_request_duration | Histogram | method, path, status | Duration of server-side request processing. | | http_server_duration_seconds | Histogram | method, path, status | Full server-side HTTP request duration (TTLB). |

Host Metrics

When using Prometheus exporter, the integration also provides comprehensive host-level metrics:

  • CPU metrics: Usage, load averages, and core counts
  • Memory metrics: Usage, available, and swap information
  • Disk metrics: Read/write operations and space usage
  • Network metrics: Interface statistics and connection counts
  • Process metrics: Memory usage, file descriptors, and uptime

Exporter Types

Prometheus Exporter

Exposes metrics in Prometheus format on a dedicated HTTP server:

otelIntegration({
  presets: {
    metricExporter: "prometheus",
    prometheusConfig: {
      port: 9464,
      endpoint: "/metrics",
    },
  },
})

Access metrics at: http://localhost:9464/metrics

OTLP Exporters

Send telemetry data to OpenTelemetry collectors or backends:

HTTP Exporter

otelIntegration({
  presets: {
    metricExporter: "http",
    traceExporter: "http",
  },
})

Environment variables:

export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4318"
# Or specify separate endpoints:
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://localhost:4318/v1/traces"
export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT="http://localhost:4318/v1/metrics"

gRPC Exporter

otelIntegration({
  presets: {
    metricExporter: "grpc",
    traceExporter: "grpc",
  },
})

Environment variables:

export OTEL_EXPORTER_OTLP_PROTOCOL="grpc"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4317"
# Or specify separate endpoints:
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://localhost:4317"
export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT="http://localhost:4317"

Proto Exporter

otelIntegration({
  presets: {
    metricExporter: "proto",
    traceExporter: "proto",
  },
})

Environment variables:

export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export OTEL_EXPORTER_OTLP_ENDPOINT="https://api.honeycomb.io:443"

Console Exporter

Output telemetry data to the console (useful for development):

otelIntegration({
  presets: {
    traceExporter: "console",
  },
})

Tracing

The integration automatically creates traces for HTTP requests with the following features:

  • Automatic span creation: Each request gets a root span
  • Nested spans: Automatic instrumentation creates child spans for various operations
  • Custom attributes: Request method, URL, status code, and response details
  • Error tracking: Exceptions are automatically recorded in spans
  • Performance timing: Request duration and TTLB measurements

Trace Attributes

Each span includes these attributes:

  • http.request.method: HTTP method (GET, POST, etc.)
  • http.request.url: Full request URL
  • http.response.status_code: HTTP status code
  • http.response.status_text: HTTP status text
  • service.name: Service name from configuration
  • service.version: Service version from configuration

Auto-Instrumentation

When using Prometheus metrics, the integration automatically enables comprehensive Node.js auto-instrumentation:

  • HTTP/HTTPS: Request/response instrumentation
  • File System: File operations monitoring
  • DNS: DNS resolution tracking
  • Network: Socket and connection monitoring
  • Express: Express.js middleware instrumentation
  • Connect: Connect middleware instrumentation

This provides deep observability into your application's behavior without additional configuration.


Development vs Production

Development Mode

In development (astro dev), the integration:

  • Automatically imports the OpenTelemetry SDK
  • Uses console exporter for traces by default
  • Provides detailed logging for debugging

Production Mode

In production (astro build), the integration:

  • Prepends the OpenTelemetry SDK to your built application
  • Uses configured exporters for telemetry export
  • Optimizes for performance and minimal overhead

Contributing

This project is a monorepo:

  • playgrounds/: Example Astro apps for testing the integration
  • packages/astro-opentelemetry-integration/: The integration source code

Setup

pnpm install --frozen-lockfile
pnpm otel-integration:dev
pnpm playground:dev
  • Edit files in packages/astro-opentelemetry-integration/
  • The playground will reload on changes

License

MIT Licensed. Made with ❤️ by Danilo Velasquez.

Acknowledgements