diff --git a/.github/workflows/config/labeler.yml b/.github/workflows/config/labeler.yml index edef8d55a056d..269195a826758 100644 --- a/.github/workflows/config/labeler.yml +++ b/.github/workflows/config/labeler.yml @@ -659,6 +659,8 @@ integration/strimzi: - strimzi/**/* integration/supabase: - supabase/**/* +integration/supabase_cloud: +- supabase_cloud/**/* integration/supervisord: - supervisord/**/* integration/supply_chain_firewall: diff --git a/supabase_cloud/CHANGELOG.md b/supabase_cloud/CHANGELOG.md new file mode 100644 index 0000000000000..a3e4ac685ba3d --- /dev/null +++ b/supabase_cloud/CHANGELOG.md @@ -0,0 +1,7 @@ +# CHANGELOG - Supabase Cloud + +## 1.0.0 / 2025-11-03 + +***Added***: + +* Initial Release with support for Supabase project metrics and Log Drain \ No newline at end of file diff --git a/supabase_cloud/README.md b/supabase_cloud/README.md new file mode 100644 index 0000000000000..ac576383af149 --- /dev/null +++ b/supabase_cloud/README.md @@ -0,0 +1,65 @@ +## Overview + +[Supabase][2] is a Postgres development platform that provides a Postgres database with additional features including +Authentication, instant APIs, Edge Functions, Realtime subscriptions, Object Storage, and Vector embeddings. +While Supabase supports a self-hosted version, this integration only supports Supabase Cloud project instances. + +With this integration, you can, per Supabase project: +- Collect essential Postgres Database metrics and monitor critical behavior. +- Collect Postgres server OS metrics and monitor CPU/Filesystem/Memory/Network load. +- With a [Supabase Log Drain][3] enabled: + - Collect Postgres database logs which can include slow statements, errors, and audit logs. + - Collect Supabase application layer logs such as edge functions and Auth/REST/Storage/Realtime APIs. + - Collect business logic log messages from your edge function applications. + +## Setup + +The Supabase Cloud integration requires the service_role API key to retrieve metrics from the hosted project's +[metrics endpoint][4] only. + +### Retrieve the service_role API key + +1. Log in to [Supabase][2] as an administrator. +2. Navigate to **Project Settings** > **API Keys**. +3. On the **Legacy API Keys** tab, retrieve the service_role API key. + +### Connect your Supabase Cloud project to Datadog + +1. Add your Supabase hosted project ID and service_role API key + |Parameters|Description| + |--------------------|--------------------| + |Project ID|Supabase project ID: E.g. `https://supabase.com/dashboard/project//settings/general`.| + |Service_role API Key|API key needed for communication with the Metrics endpoint.| + +2. Click the **Save** button to save your settings. + +## Data Collected + +### Metrics + +See [metadata.csv][5] for the full list of metrics provided by this integration. + +### Logs + +When you enable a Log Drain within Supabase for your hosted project, all Postgres and application log +messages will be pushed to Datadog. Datadog leverages its built-in log pipelines to parse and enrich these logs, +facilitating easy search and detailed insights. + +### Events + +The Supabase Cloud integration does not include any events. + +### Service Checks + +The Supabase Cloud integration does not include any service checks. + +## Troubleshooting + +Need help? Contact [Datadog support][1]. + +[1]: https://docs.datadoghq.com/help/ +[2]: https://supabase.com/ +[3]: https://supabase.com/docs/guides/telemetry/log-drains +[4]: https://supabase.com/docs/guides/telemetry/metrics +[5]: https://github.com/DataDog/integrations-core/blob/master/supabase_cloud/metadata.csv + diff --git a/supabase_cloud/assets/service_checks.json b/supabase_cloud/assets/service_checks.json new file mode 100644 index 0000000000000..fe51488c7066f --- /dev/null +++ b/supabase_cloud/assets/service_checks.json @@ -0,0 +1 @@ +[] diff --git a/supabase_cloud/manifest.json b/supabase_cloud/manifest.json new file mode 100644 index 0000000000000..ef18859070219 --- /dev/null +++ b/supabase_cloud/manifest.json @@ -0,0 +1,54 @@ +{ + "manifest_version": "2.0.0", + "app_uuid": "76054e37-5919-442f-a7a6-5a77ed5e7b0e", + "app_id": "supabase-cloud", + "display_on_public_website": false, + "tile": { + "overview": "README.md#Overview", + "configuration": "README.md#Setup", + "support": "README.md#Support", + "changelog": "CHANGELOG.md", + "description": "Monitor the activity, health, and performance of your Supabase Cloud projects.", + "title": "Supabase Cloud", + "media": [], + "classifier_tags": [ + "Category::Cloud", + "Category::Developer Tools", + "Category::Metrics", + "Category::Log Collection", + "Offering::Integration", + "Submitted Data Type::Metrics", + "Submitted Data Type::Logs" + ] + }, + "assets": { + "integration": { + "auto_install": false, + "source_type_id": 60482379, + "source_type_name": "Supabase Cloud", + "events": { + "creates_events": false + }, + "metrics": { + "prefix": "supabase.cloud.", + "check": [ + "supabase.cloud.pg.up", + "supabase.cloud.pg_database.size.mb" + ], + "metadata_path": "metadata.csv" + }, + "service_checks": { + "metadata_path": "assets/service_checks.json" + } + }, + "dashboards": {}, + "monitors": {}, + "saved_views": {} + }, + "author": { + "support_email": "help@datadoghq.com", + "name": "Datadog", + "homepage": "https://www.datadoghq.com", + "sales_email": "info@datadoghq.com" + } +} diff --git a/supabase_cloud/metadata.csv b/supabase_cloud/metadata.csv new file mode 100644 index 0000000000000..2b56cb9927f91 --- /dev/null +++ b/supabase_cloud/metadata.csv @@ -0,0 +1,66 @@ +metric_name,metric_type,interval,unit_name,per_unit_name,description,orientation,integration,short_name,curated_metric,sample_tags +supabase.cloud.auth_users.user_count,gauge,,user,,The number of users in the project database.,0,supabase_cloud,,, +supabase.cloud.connection.stats.connection.count,gauge,,user,,The number of connections to the project database.,0,supabase_cloud,,, +supabase.cloud.node.cpu.online,count,,,,The CPU is online.,0,supabase_cloud,,, +supabase.cloud.node.cpu.seconds.count,count,,second,,The number of seconds the CPUs spent in each mode.,0,supabase_cloud,,, +supabase.cloud.node.disk.filesystem.info,gauge,,,,The disk filesystem description.,0,supabase_cloud,,, +supabase.cloud.node.disk.info,gauge,,,,"The disk device name, model, etc. described via tags.",0,supabase_cloud,,, +supabase.cloud.node.disk.io_time_seconds.count,count,,second,,The total seconds spent doing I/Os.,0,supabase_cloud,,, +supabase.cloud.node.disk.io_time_weighted_seconds.count,count,,,,The weighted # of seconds spent doing I/Os.,0,supabase_cloud,,, +supabase.cloud.node.disk.read_bytes.count,count,,byte,,The total number of bytes read successfully.,0,supabase_cloud,,, +supabase.cloud.node.disk.read_time_seconds.count,count,,,,The total number of seconds spent by all reads.,0,supabase_cloud,,, +supabase.cloud.node.disk.write_time_seconds.count,count,,second,,This is the total number of seconds spent by all writes.,0,supabase_cloud,,, +supabase.cloud.node.disk.written_bytes.count,count,,byte,,The total number of bytes written successfully.,0,supabase_cloud,,, +supabase.cloud.node.filesystem.avail.bytes,gauge,,byte,,The filesystem space available to non-root users in bytes.,0,supabase_cloud,,, +supabase.cloud.node.filesystem.device_error,gauge,,,,Whether an error occurred while getting statistics for the given device.,0,supabase_cloud,,, +supabase.cloud.node.filesystem.size_bytes,gauge,,byte,,The filesystem size in bytes,0,supabase_cloud,,, +supabase.cloud.node.load1,gauge,,,,1m load average.,0,supabase_cloud,,, +supabase.cloud.node.load15,gauge,,,,15m load average.,0,supabase_cloud,,, +supabase.cloud.node.load5,gauge,,,,5m load average.,0,supabase_cloud,,, +supabase.cloud.node.memory.active_bytes,gauge,,byte,,Memory information field Active_bytes.,0,supabase_cloud,,, +supabase.cloud.node.memory.buffers.bytes,gauge,,byte,,Memory information field Buffers_bytes.,0,supabase_cloud,,, +supabase.cloud.node.memory.cached_byte.,gauge,,byte,,Memory information field Cached_bytes.,0,supabase_cloud,,, +supabase.cloud.node.memory.inactive.bytes,gauge,,byte,,Memory information field Inactive_bytes.,0,supabase_cloud,,, +supabase.cloud.node.memory.mem_available.bytes,gauge,,byte,,Memory information field MemAvailable_bytes.,0,supabase_cloud,,, +supabase.cloud.node.memory.mem_free.bytes,gauge,,byte,,Memory information field MemFree_bytes.,0,supabase_cloud,,, +supabase.cloud.node.memory.mem_total.bytes,gauge,,byte,,Memory information field MemTotal_bytes.,0,supabase_cloud,,, +supabase.cloud.node.memory.swap_free.bytes,gauge,,byte,,Memory information field SwapFree_bytes.,0,supabase_cloud,,, +supabase.cloud.node.memory.swap_total.bytes,gauge,,byte,,Memory information field SwapTotal_bytes.,0,supabase_cloud,,, +supabase.cloud.node.network.receive_bytes.count,count,,byte,,Network device statistic receive_bytes.,0,supabase_cloud,,, +supabase.cloud.node.network.transmit_bytes.count,count,,byte,,Network device statistic transmit_bytes.,0,supabase_cloud,,, +supabase.cloud.node.vmstat.oom_kill.count,count,,,,/proc/vmstat information field oom_kill.,0,supabase_cloud,,, +supabase.cloud.pg.up,gauge,,,,Whether the last scrape of metrics from PostgreSQL was able to connect to the server.,0,supabase_cloud,,, +supabase.cloud.pg_database.size.mb,gauge,,megabyte,,Disk space used by the database.,0,supabase_cloud,,, +supabase.cloud.pg_stat_bgwriter.buffers_alloc.count,count,,,,Buffers allocated,0,supabase_cloud,,, +supabase.cloud.pg_stat_bgwriter.buffers_checkpoint.count,count,,,,Buffers written during checkpoints,0,supabase_cloud,,, +supabase.cloud.pg_stat_bgwriter.buffers_clean.count,count,,,,Buffers written by bg writter,0,supabase_cloud,,, +supabase.cloud.pg_stat_bgwriter.checkpoint_sync_time.count,count,,,,Time spent synchronizing checkpoint files to disk,0,supabase_cloud,,, +supabase.cloud.pg_stat_bgwriter.checkpoint_write_time.count,count,,,,Time spent writing checkpoint files to disk,0,supabase_cloud,,, +supabase.cloud.pg_stat_bgwriter.checkpoints_req.count,count,,,,Requested checkpoints performed,0,supabase_cloud,,, +supabase.cloud.pg_stat_bgwriter.checkpoints_timed.count,count,,,,Scheduled checkpoints performed,0,supabase_cloud,,, +supabase.cloud.pg_stat_bgwriter.maxwritten_clean.count,count,,,,Number of times bg writer stopped a cleaning scan because it had written too many buffers,0,supabase_cloud,,, +supabase.cloud.pg_stat_bgwriter.stats_reset.count,count,,,,Most recent stat reset time,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.blks_hit.count,count,,,,Disk blocks found in buffer cache,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.blks_read.count,count,,,,Number of disk blocks read,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.deadlocks.count,count,,,,Deadlocks detected,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.num_backends,gauge,,,,The number of active backends,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.temp_bytes.count,count,,byte,,Temp data written by queries,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.temp_files.count,count,,,,Temp files created by queries,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.tup_deleted.count,count,,,,Rows deleted,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.tup_fetched.count,count,,,,Rows fetched by queries,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.tup_inserted.count,count,,,,Rows inserted,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.tup_returned.count,count,,,,Rows returned by queries,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.tup_updated.count,count,,,,Rows updated,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.xact_commit.count,count,,,,Transactions committed,0,supabase_cloud,,, +supabase.cloud.pg_stat_database.xact_rollback.count,count,,,,Transactions rolled back,0,supabase_cloud,,, +supabase.cloud.pg_status.in_recovery,gauge,,,,Database in recovery,0,supabase_cloud,,, +supabase.cloud.pg_wal.size,gauge,,megabyte,,Disk space used by WAL files,0,supabase_cloud,,, +supabase.cloud.pgrst.db_pool.available_connections,gauge,,connection,,Available connections in the pool,0,supabase_cloud,,, +supabase.cloud.pgrst.db_pool.max_connections,gauge,,connection,,Max pool connections,0,supabase_cloud,,, +supabase.cloud.pgrst.db_pool.timeouts.count,count,,connection,,The total number of pool connection timeouts,0,supabase_cloud,,, +supabase.cloud.pgrst.db_pool.waiting,gauge,,,,Requests waiting to acquire a pool connection,0,supabase_cloud,,, +supabase.cloud.pgrst.schema_cache.loads.count,count,,,,The total number of times the schema cache was loaded,0,supabase_cloud,,, +supabase.cloud.pgrst.schema_cache.query_time_seconds,gauge,,second,,The query time in seconds of the last schema cache load,0,supabase_cloud,,, +supabase.cloud.postgresql.restarts.count,count,,,,Number of times postgresql has been restarted,0,supabase_cloud,,, +supabase.cloud.realtime_postgres_changes.client_subscriptions,gauge,,,,Client subscriptions listening for Postgres changes,0,supabase_cloud,,, +supabase.cloud.realtime_postgres_changes.total_subscriptions,gauge,,,,Total subscription records listening for Postgres changes,0,supabase_cloud,,,