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 🙏

© 2025 – Pkg Stats / Ryan Hefner

strapi-prometheus

v2.6.0

Published

A powerful Strapi plugin that adds comprehensive Prometheus metrics to monitor your API performance, system resources, and application behavior using prom-client.

Readme

📊 Strapi Prometheus Plugin

npm downloads npm version license GitHub stars

A powerful middleware plugin that adds comprehensive Prometheus metrics to your Strapi application using prom-client 📈. Monitor your API performance, track system resources, and gain valuable insights into your application's behavior with just a few lines of configuration! 🚀

✨ Features

  • 🚀 Real-time API Metrics - Track HTTP request duration, payload sizes, and response codes with intelligent route normalization
  • 📈 System Monitoring - Collect Node.js process metrics as recommended by Prometheus
  • 🔒 Secure by Default - Dedicated metrics server (port 9000) isolated from your main application
  • 🏷️ Custom Labels - Add custom labels to categorize and filter your metrics across environments 🌍
  • 📊 Database Lifecycle Tracking - Monitor Strapi lifecycle events (create, update, delete) duration ⚡
  • 🔌 Easy Integration - Simple configuration with sensible defaults - get started in minutes!
  • 🆔 Version Tracking - Monitor Strapi version information for deployment tracking
  • 🎯 Smart Path Normalization - Flexible normalization with regex patterns or custom functions to group similar routes for better metric cardinality 📊
  • 📦 TypeScript Support - Built with TypeScript for better developer experience

⚡ Installation

1. Install the package 📦

npm install strapi-prometheus
# or
yarn add strapi-prometheus
# or
pnpm add strapi-prometheus

2. Install peer dependencies 🔧

npm install prom-client
# or
yarn add prom-client
# or
pnpm add prom-client

3. Configure the plugin ⚙️

Create or update your config/plugins.js (or config/plugins.ts for TypeScript):

// config/plugins.js
module.exports = {
  // ...other plugins
  prometheus: {
    enabled: true,
    config: {
      // Optional: Collect Node.js default metrics
      // See collectDefaultMetricsOption of prom-client for all options
      collectDefaultMetrics: false, // or { prefix: 'my_app_' }
      
      // Optional: Add custom labels to all metrics
      labels: { 
        app: "my-strapi-app",
        environment: "production"
      },
      
      // Server configuration
      // Set to false to expose metrics on your main Strapi server (not recommended)
      server: {
        port: 9000,           // Metrics server port
        host: '0.0.0.0',      // Metrics server host
        path: '/metrics'      // Metrics endpoint path
      },
      // OR disable separate server (use with caution):
      // server: false
      
      // 🎯 Path Normalization Rules
      normalize: [
        [/\/(?:[a-z0-9]{24,25}|\d+)(?=\/|$)/, '/:id'], // Document IDs or numeric IDs
        [/\/uploads\/[^\/]+\.[a-zA-Z0-9]+/, '/uploads/:file'], // Uploaded files with extensions
      ]
    }
  }
};

For TypeScript projects:

// config/plugins.ts
export default {
  prometheus: {
    enabled: true,
    config: {
      collectDefaultMetrics: false,
      labels: { 
        app: "my-strapi-app",
        environment: process.env.NODE_ENV || "development"
      },
      server: {
        port: parseInt(process.env.METRICS_PORT || '9000'),
        host: process.env.METRICS_HOST || '0.0.0.0',
        path: '/metrics'
      },
      
      // Custom normalization function (alternative to array rules)
      normalize: (ctx) => {
        let path = ctx.path;
        
        // Custom logic for your specific needs
        if (path.startsWith('/api/')) {
          path = path.replace(/\/\d+/g, '/:id'); // Replace numeric IDs
        }
        
        return path;
      }
    }
  }
};

📊 Available Metrics

The plugin automatically collects the following metrics with intelligent route pattern detection ✨:

| Metric Name | Description | Type | Labels | |-------------|-------------|------|--------| | http_request_duration_seconds | Duration of HTTP requests in seconds ⏱️ | Histogram | method, route, status | | http_request_content_length_bytes | Size of request payloads in bytes 📤 | Histogram | method, route, status | | http_response_content_length_bytes | Size of response payloads in bytes 📥 | Histogram | method, route, status | | strapi_version_info | Strapi version information 🏷️ | Gauge | version | | lifecycle_duration_seconds | Duration of Strapi database lifecycle events 💾 | Histogram | event |

Optional System Metrics

When collectDefaultMetrics is enabled, you'll also get Node.js process metrics:

  • process_cpu_user_seconds_total - CPU time spent in user mode
  • process_cpu_system_seconds_total - CPU time spent in system mode
  • process_start_time_seconds - Process start time
  • process_resident_memory_bytes - Resident memory size
  • nodejs_heap_size_total_bytes - Total heap size
  • nodejs_heap_size_used_bytes - Used heap size
  • nodejs_external_memory_bytes - External memory usage
  • And more...

🎯 Smart Path Normalization

The plugin features intelligent path normalization to ensure optimal metric cardinality by grouping similar routes together ✨

📝 Configuration Options

You can configure path normalization in two ways:

1. Array of Regex Rules (Recommended)

Use an array of [RegExp, replacement] tuples to define normalization patterns:

normalize: [
  [/\/(?:[a-z0-9]{24,25}|\d+)(?=\/|$)/, '/:id'], // Document IDs or numeric IDs
  [/\/uploads\/[^\/]+\.[a-zA-Z0-9]+/, '/uploads/:file'], // Uploaded files with extensions
  
  // Custom patterns
  [/\/users\/\d+/, '/users/:id'],                                   // /users/123
  [/\/orders\/ORD\d+/, '/orders/:orderCode']                        // /orders/ORD12345
]

2. Custom Function

Use a function for dynamic normalization logic:

normalize: (ctx) => {
  let path = ctx.path;
  
  // Custom normalization logic
  if (path.startsWith('/api/')) {
    path = path.replace(/\/\d+/g, '/:id');           // Replace numeric IDs
    path = path.replace(/\/[a-f0-9-]{36}/gi, '/:uuid'); // Replace UUIDs
  }
  
  // Multi-tenant example
  if (path.startsWith('/tenant/')) {
    path = path.replace(/^\/tenant\/[^\/]+/, '/tenant/:id');
  }
  
  return path;
}

🏷️ Built-in Patterns

The plugin includes pre-configured patterns for common Strapi routes:

| Original Path | Normalized Path | Description | |--------------|----------------|-------------| | /api/posts/123 | /api/posts/:id | API resource with ID | | /api/posts/123/comments/456 | /api/posts/:id/comments/:id | Nested resources | | /admin/content-manager/collection-types/api::post.post/123 | /admin/content-manager/:type/:contentType/:id | Admin content manager | | /uploads/image.jpg | /uploads/:file | File uploads | | /en/api/posts/123 | /:locale/api/posts/:id | i18n localized routes | | /fr-FR/dashboard | /:locale/dashboard | Locale-specific pages |

🚀 Benefits

  • Low Cardinality - Groups similar routes to prevent metric explosion
  • Prometheus-Friendly - Follows Prometheus best practices
  • Flexible - Support both regex patterns and custom functions
  • Performance - Efficient pattern matching with minimal overhead
  • Strapi-Aware - Built-in knowledge of Strapi routing conventions

🚀 Quick Start

  1. 📦 Install and configure the plugin (see Installation)
  2. 🎬 Start your Strapi application
  3. 📊 Metrics will be available at http://localhost:9000/metrics
  4. 🔗 Configure Prometheus to scrape this endpoint

📊 Accessing Metrics

Dedicated Server (Default & Recommended)

By default, metrics are served on a separate server:

curl http://localhost:9000/metrics

Main Strapi Server (Not Recommended)

If you set server: false, metrics will be available on your main Strapi server:

# Requires authentication token
curl -H "Authorization: Bearer YOUR_API_TOKEN" http://localhost:1337/api/metrics

👮‍♀️ Security Considerations

[!CAUTION] Metrics can contain sensitive information about your application's usage patterns, performance characteristics, and potentially user behavior. Always secure your metrics endpoint appropriately.

Recommended: Dedicated Server (Default)

The plugin starts a separate server on port 9000 by default, isolated from your main application:

  • Secure by design - No external access to your main application
  • Simple firewall rules - Block port 9000 from external access
  • Performance - No impact on your main application
  • Monitoring-specific - Dedicated to metrics collection

Alternative: Main Server Integration

You can expose metrics on your main Strapi server by setting server: false:

  • ⚠️ Authentication required - Protected by Strapi's auth middleware
  • ⚠️ API token needed - Must create and manage API tokens
  • ⚠️ Potential exposure - Metrics endpoint on your main application
  • ⚠️ Performance impact - Additional load on main server

We strongly recommend using the dedicated server approach.

🤝 Compatibility

| Strapi Version | Plugin Version | Status | |---------------|----------------|---------| | v5.x | v2.x.x | ✅ Fully Supported ⭐ | | v4.x | v1.x.x | ❌ EOL 🔧 |

Note: For new projects, we recommend using Strapi v5.x with the latest plugin version! 🎯

📊 Grafana Dashboards

Ready-to-use Grafana dashboards for visualizing your Strapi metrics:

Official Dashboards

Contributing Dashboards

Have a great dashboard? We'd love to feature it! Please open a pull request with your dashboard JSON. 🎨

🔍 Troubleshooting

Common Issues

Metrics server not starting

  • Check if port 9000 is already in use
  • Verify firewall settings
  • Check Strapi logs for error messages

No metrics appearing

  • Ensure the plugin is properly enabled in config/plugins.js
  • Verify that prom-client is installed
  • Check that requests are being made to your Strapi application

Memory usage increasing

  • Consider disabling collectDefaultMetrics if not needed
  • Review custom labels - avoid high-cardinality labels
  • Monitor Prometheus scrape interval

🆘 Getting Help

🏗️ v1 → v2 Migration Guide

🏗️ Migration Guide (v1 → v2)

Version 2.0 brings significant improvements and Strapi v5 support. Here's what you need to know:

🔧 Configuration Changes

Old (v1):

module.exports = {
  'strapi-prometheus': {
    enabled: true,
    config: {
      // v1 config
    }
  }
};

New (v2):

module.exports = {
  prometheus: {  // ← Plugin name simplified
    enabled: true,
    config: {
      // v2 config (see configuration section above)
    }
  }
};

🚀 New Features in v2

  • Dedicated metrics server - Default behavior for better security
  • Simplified configuration - Easier setup and maintenance
  • Strapi v5 support - Future-ready compatibility
  • Enhanced metrics - More comprehensive monitoring
  • Improved performance - Optimized for production use

📊 Metric and Label Changes

| v1 Metric | v2 Metric | Change | |-----------|-----------|---------| | http_request_duration_s | http_request_duration_seconds | ✅ Renamed for clarity | | http_request_size_bytes | http_request_content_length_bytes | ✅ Renamed for accuracy | | http_response_size_bytes | http_response_content_length_bytes | ✅ Renamed for accuracy | | Labels: path | Labels: route | ✅ More consistent route patterns | | Apollo metrics | ❌ | 🗑️ Removed - use apollo-prometheus-exporter | | - | http_requests_total | ✅ New counter metric | | - | http_active_requests | ✅ New gauge metric |

🏷️ Enhanced Label Strategy

v2 Improvements:

  • Smart route detection - Uses _matchedRoute when available for accurate patterns
  • Consistent normalization - /api/articles/123/api/articles/:id
  • Low cardinality - Prevents metric explosion from dynamic paths

🔄 Migration Steps

  1. Update plugin name in your configuration
  2. Review new configuration options (especially server settings)
  3. Update Prometheus scrape config if using custom settings
  4. Update Grafana dashboards with new metric names
  5. Test thoroughly in development before production deployment

⚠️ Breaking Changes

  • Apollo metrics removed - If you were using Apollo GraphQL metrics, you'll need to implement them separately
  • Custom registry removed - Now uses the default prom-client registry (this actually gives you more flexibility!)
  • Configuration structure changed - Follow the new configuration format

💡 Recommendations

  • Start with default settings and customize as needed
  • Use the dedicated metrics server (default behavior)
  • Monitor your Prometheus targets after migration
  • Consider this a good time to review your monitoring setup

🤝 Contributing

We welcome contributions! Here's how you can help:

🐛 Reporting Issues

  • Use the issue tracker 📝
  • Search existing issues before creating new ones 🔍
  • Provide clear reproduction steps 📋
  • Include environment details (Strapi version, Node.js version, OS) 💻

💻 Development

  1. Fork the repository 🍴
  2. Create a feature branch: git checkout -b feature/amazing-feature 🌿
  3. Make your changes ✨
  4. Add tests if applicable 🧪
  5. Commit with clear messages: git commit -m 'Add amazing feature' 💬
  6. Push to your branch: git push origin feature/amazing-feature 🚀
  7. Open a Pull Request 🔄

📝 Documentation

  • Improve README documentation 📖
  • Add code examples 💡
  • Create tutorials or blog posts ✍️
  • Share Grafana dashboards 📊

📜 License

This project is licensed under the MIT License - see the LICENSE file for details.

👨‍💻 Author & Maintainer

Xander Denecker (@XanderD99)

🙏 Acknowledgments

  • Prometheus - The monitoring system that makes this all possible
  • prom-client - The Node.js Prometheus client library
  • Strapi - The leading open-source headless CMS
  • All contributors who have helped improve this plugin

⭐ If this plugin helps you, please consider giving it a star on GitHub!