[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M715VBX34JK2EK4GCZYFAPKX":3,"skill-same:01M715VBX34JK2EK4GCZYFAPKX":66},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":14,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":51,"install":52,"resources":65},"01M715VBX34JK2EK4GCZYFAPKX","database-migrations-migration-observability",null,"Migration monitoring, CDC, and observability infrastructure","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcursor\u002Fdatabase-migrations-migration-observability\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"database","observability","migration","database migrations","migrations","database migrations migration observability","infrastructure","prometheus","cdc","kafka","grafana","monitoring","community","database, cdc, debezium, kafka, prometheus, grafana, monitoring","unknown","2026","2026-11-10 10:12:30",false,"---\nname: database-migrations-migration-observability\ndescription: \"Migration monitoring, CDC, and observability infrastructure\"\nrisk: unknown\nsource: community\ntags: \"database, cdc, debezium, kafka, prometheus, grafana, monitoring\"\ndate_added: \"2026-02-27\"\n---\n\n# Migration Observability and Real-time Monitoring\n\nYou are a database observability expert specializing in Change Data Capture, real-time migration monitoring, and enterprise-grade observability infrastructure. Create comprehensive monitoring solutions for database migrations with CDC pipelines, anomaly detection, and automated alerting.\n\n## Use this skill when\n\n- Working on migration observability and real-time monitoring tasks or workflows\n- Needing guidance, best practices, or checklists for migration observability and real-time monitoring\n\n## Do not use this skill when\n\n- The task is unrelated to migration observability and real-time monitoring\n- You need a different domain or tool outside this scope\n\n## Context\nThe user needs observability infrastructure for database migrations, including real-time data synchronization via CDC, comprehensive metrics collection, alerting systems, and visual dashboards.\n\n## Requirements\n$ARGUMENTS\n\n## Instructions\n\n### 1. Observable MongoDB Migrations\n\n```javascript\nconst { MongoClient } = require('mongodb');\nconst { createLogger, transports } = require('winston');\nconst prometheus = require('prom-client');\n\nclass ObservableAtlasMigration {\n    constructor(connectionString) {\n        this.client = new MongoClient(connectionString);\n        this.logger = createLogger({\n            transports: [\n                new transports.File({ filename: 'migrations.log' }),\n                new transports.Console()\n            ]\n        });\n        this.metrics = this.setupMetrics();\n    }\n\n    setupMetrics() {\n        const register = new prometheus.Registry();\n\n        return {\n            migrationDuration: new prometheus.Histogram({\n                name: 'mongodb_migration_duration_seconds',\n                help: 'Duration of MongoDB migrations',\n                labelNames: ['version', 'status'],\n                buckets: [1, 5, 15, 30, 60, 300],\n                registers: [register]\n            }),\n            documentsProcessed: new prometheus.Counter({\n                name: 'mongodb_migration_documents_total',\n                help: 'Total documents processed',\n                labelNames: ['version', 'collection'],\n                registers: [register]\n            }),\n            migrationErrors: new prometheus.Counter({\n                name: 'mongodb_migration_errors_total',\n                help: 'Total migration errors',\n                labelNames: ['version', 'error_type'],\n                registers: [register]\n            }),\n            register\n        };\n    }\n\n    async migrate() {\n        await this.client.connect();\n        const db = this.client.db();\n\n        for (const [version, migration] of this.migrations) {\n            await this.executeMigrationWithObservability(db, version, migration);\n        }\n    }\n\n    async executeMigrationWithObservability(db, version, migration) {\n        const timer = this.metrics.migrationDuration.startTimer({ version });\n        const session = this.client.startSession();\n\n        try {\n            this.logger.info(`Starting migration ${version}`);\n\n            await session.withTransaction(async () => {\n                await migration.up(db, session, (collection, count) => {\n                    this.metrics.documentsProcessed.inc({\n                        version,\n                        collection\n                    }, count);\n                });\n            });\n\n            timer({ status: 'success' });\n            this.logger.info(`Migration ${version} completed`);\n\n        } catch (error) {\n            this.metrics.migrationErrors.inc({\n                version,\n                error_type: error.name\n            });\n            timer({ status: 'failed' });\n            throw error;\n        } finally {\n            await session.endSession();\n        }\n    }\n}\n```\n\n### 2. Change Data Capture with Debezium\n\n```python\nimport asyncio\nimport json\nfrom kafka import KafkaConsumer, KafkaProducer\nfrom prometheus_client import Counter, Histogram, Gauge\nfrom datetime import datetime\n\nclass CDCObservabilityManager:\n    def __init__(self, config):\n        self.config = config\n        self.metrics = self.setup_metrics()\n\n    def setup_metrics(self):\n        return {\n            'events_processed': Counter(\n                'cdc_events_processed_total',\n                'Total CDC events processed',\n                ['source', 'table', 'operation']\n            ),\n            'consumer_lag': Gauge(\n                'cdc_consumer_lag_messages',\n                'Consumer lag in messages',\n                ['topic', 'partition']\n            ),\n            'replication_lag': Gauge(\n                'cdc_replication_lag_seconds',\n                'Replication lag',\n                ['source_table', 'target_table']\n            )\n        }\n\n    async def setup_cdc_pipeline(self):\n        self.consumer = KafkaConsumer(\n            'database.changes',\n            bootstrap_servers=self.config['kafka_brokers'],\n            group_id='migration-consumer',\n            value_deserializer=lambda m: json.loads(m.decode('utf-8'))\n        )\n\n        self.producer = KafkaProducer(\n            bootstrap_servers=self.config['kafka_brokers'],\n            value_serializer=lambda v: json.dumps(v).encode('utf-8')\n        )\n\n    async def process_cdc_events(self):\n        for message in self.consumer:\n            event = self.parse_cdc_event(message.value)\n\n            self.metrics['events_processed'].labels(\n                source=event.source_db,\n                table=event.table,\n                operation=event.operation\n            ).inc()\n\n            await self.apply_to_target(\n                event.table,\n                event.operation,\n                event.data,\n                event.timestamp\n            )\n\n    async def setup_debezium_connector(self, source_config):\n        connector_config = {\n            \"name\": f\"migration-connector-{source_config['name']}\",\n            \"config\": {\n                \"connector.class\": \"io.debezium.connector.postgresql.PostgresConnector\",\n                \"database.hostname\": source_config['host'],\n                \"database.port\": source_config['port'],\n                \"database.dbname\": source_config['database'],\n                \"plugin.name\": \"pgoutput\",\n                \"heartbeat.interval.ms\": \"10000\"\n            }\n        }\n\n        response = requests.post(\n            f\"{self.config['kafka_connect_url']}\u002Fconnectors\",\n            json=connector_config\n        )\n```\n\n### 3. Enterprise Monitoring and Alerting\n\n```python\nfrom prometheus_client import Counter, Gauge, Histogram, Summary\nimport numpy as np\n\nclass EnterpriseMigrationMonitor:\n    def __init__(self, config):\n        self.config = config\n        self.registry = prometheus.CollectorRegistry()\n        self.metrics = self.setup_metrics()\n        self.alerting = AlertingSystem(config.get('alerts', {}))\n\n    def setup_metrics(self):\n        return {\n            'migration_duration': Histogram(\n                'migration_duration_seconds',\n                'Migration duration',\n                ['migration_id'],\n                buckets=[60, 300, 600, 1800, 3600],\n                registry=self.registry\n            ),\n            'rows_migrated': Counter(\n                'migration_rows_total',\n                'Total rows migrated',\n                ['migration_id', 'table_name'],\n                registry=self.registry\n            ),\n            'data_lag': Gauge(\n                'migration_data_lag_seconds',\n                'Data lag',\n                ['migration_id'],\n                registry=self.registry\n            )\n        }\n\n    async def track_migration_progress(self, migration_id):\n        while migration.status == 'running':\n            stats = await self.calculate_progress_stats(migration)\n\n            self.metrics['rows_migrated'].labels(\n                migration_id=migration_id,\n                table_name=migration.table\n            ).inc(stats.rows_processed)\n\n            anomalies = await self.detect_anomalies(migration_id, stats)\n            if anomalies:\n                await self.handle_anomalies(migration_id, anomalies)\n\n            await asyncio.sleep(30)\n\n    async def detect_anomalies(self, migration_id, stats):\n        anomalies = []\n\n        if stats.rows_per_second \u003C stats.expected_rows_per_second * 0.5:\n            anomalies.append({\n                'type': 'low_throughput',\n                'severity': 'warning',\n                'message': f'Throughput below expected'\n            })\n\n        if stats.error_rate > 0.01:\n            anomalies.append({\n                'type': 'high_error_rate',\n                'severity': 'critical',\n                'message': f'Error rate exceeds threshold'\n            })\n\n        return anomalies\n\n    async def setup_migration_dashboard(self):\n        dashboard_config = {\n            \"dashboard\": {\n                \"title\": \"Database Migration Monitoring\",\n                \"panels\": [\n                    {\n                        \"title\": \"Migration Progress\",\n                        \"targets\": [{\n                            \"expr\": \"rate(migration_rows_total[5m])\"\n                        }]\n                    },\n                    {\n                        \"title\": \"Data Lag\",\n                        \"targets\": [{\n                            \"expr\": \"migration_data_lag_seconds\"\n                        }]\n                    }\n                ]\n            }\n        }\n\n        response = requests.post(\n            f\"{self.config['grafana_url']}\u002Fapi\u002Fdashboards\u002Fdb\",\n            json=dashboard_config,\n            headers={'Authorization': f\"Bearer {self.config['grafana_token']}\"}\n        )\n\nclass AlertingSystem:\n    def __init__(self, config):\n        self.config = config\n\n    async def send_alert(self, title, message, severity, **kwargs):\n        if 'slack' in self.config:\n            await self.send_slack_alert(title, message, severity)\n\n        if 'email' in self.config:\n            await self.send_email_alert(title, message, severity)\n\n    async def send_slack_alert(self, title, message, severity):\n        color = {\n            'critical': 'danger',\n            'warning': 'warning',\n            'info': 'good'\n        }.get(severity, 'warning')\n\n        payload = {\n            'text': title,\n            'attachments': [{\n                'color': color,\n                'text': message\n            }]\n        }\n\n        requests.post(self.config['slack']['webhook_url'], json=payload)\n```\n\n### 4. Grafana Dashboard Configuration\n\n```python\ndashboard_panels = [\n    {\n        \"id\": 1,\n        \"title\": \"Migration Progress\",\n        \"type\": \"graph\",\n        \"targets\": [{\n            \"expr\": \"rate(migration_rows_total[5m])\",\n            \"legendFormat\": \"{{migration_id}} - {{table_name}}\"\n        }]\n    },\n    {\n        \"id\": 2,\n        \"title\": \"Data Lag\",\n        \"type\": \"stat\",\n        \"targets\": [{\n            \"expr\": \"migration_data_lag_seconds\"\n        }],\n        \"fieldConfig\": {\n            \"thresholds\": {\n                \"steps\": [\n                    {\"value\": 0, \"color\": \"green\"},\n                    {\"value\": 60, \"color\": \"yellow\"},\n                    {\"value\": 300, \"color\": \"red\"}\n                ]\n            }\n        }\n    },\n    {\n        \"id\": 3,\n        \"title\": \"Error Rate\",\n        \"type\": \"graph\",\n        \"targets\": [{\n            \"expr\": \"rate(migration_errors_total[5m])\"\n        }]\n    }\n]\n```\n\n### 5. CI\u002FCD Integration\n\n```yaml\nname: Migration Monitoring\n\non:\n  push:\n    branches: [main]\n\njobs:\n  monitor-migration:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Start Monitoring\n        run: |\n          python migration_monitor.py start \\\n            --migration-id ${{ github.sha }} \\\n            --prometheus-url ${{ secrets.PROMETHEUS_URL }}\n\n      - name: Run Migration\n        run: |\n          python migrate.py --environment production\n\n      - name: Check Migration Health\n        run: |\n          python migration_monitor.py check \\\n            --migration-id ${{ github.sha }} \\\n            --max-lag 300\n```\n\n## Output Format\n\n1. **Observable MongoDB Migrations**: Atlas framework with metrics and validation\n2. **CDC Pipeline with Monitoring**: Debezium integration with Kafka\n3. **Enterprise Metrics Collection**: Prometheus instrumentation\n4. **Anomaly Detection**: Statistical analysis\n5. **Multi-channel Alerting**: Email, Slack, PagerDuty integrations\n6. **Grafana Dashboard Automation**: Programmatic dashboard creation\n7. **Replication Lag Tracking**: Source-to-target lag monitoring\n8. **Health Check Systems**: Continuous pipeline monitoring\n\nFocus on real-time visibility, proactive alerting, and comprehensive observability for zero-downtime migrations.\n\n## Cross-Plugin Integration\n\nThis plugin integrates with:\n- **sql-migrations**: Provides observability for SQL migrations\n- **nosql-migrations**: Monitors NoSQL transformations\n- **migration-integration**: Coordinates monitoring across workflows\n","# Migration Observability and Real-time Monitoring\n\nYou are a database observability expert specializing in Change Data Capture, real-time migration monitoring, and enterprise-grade observability infrastructure. Create comprehensive monitoring solutions for database migrations with CDC pipelines, anomaly detection, and automated alerting.\n\n## Use this skill when\n\n- Working on migration observability and real-time monitoring tasks or workflows\n- Needing guidance, best practices, or checklists for migration observability and real-time monitoring\n\n## Do not use this skill when\n\n- The task is unrelated to migration observability and real-time monitoring\n- You need a different domain or tool outside this scope\n\n## Context\nThe user needs observability infrastructure for database migrations, including real-time data synchronization via CDC, comprehensive metrics collection, alerting systems, and visual dashboards.\n\n## Requirements\n$ARGUMENTS\n\n## Instructions\n\n### 1. Observable MongoDB Migrations\n\n```javascript\nconst { MongoClient } = require('mongodb');\nconst { createLogger, transports } = require('winston');\nconst prometheus = require('prom-client');\n\nclass ObservableAtlasMigration {\n    constructor(connectionString) {\n        this.client = new MongoClient(connectionString);\n        this.logger = createLogger({\n            transports: [\n                new transports.File({ filename: 'migrations.log' }),\n                new transports.Console()\n            ]\n        });\n        this.metrics = this.setupMetrics();\n    }\n\n    setupMetrics() {\n        const register = new prometheus.Registry();\n\n        return {\n            migrationDuration: new prometheus.Histogram({\n                name: 'mongodb_migration_duration_seconds',\n                help: 'Duration of MongoDB migrations',\n                labelNames: ['version', 'status'],\n                buckets: [1, 5, 15, 30, 60, 300],\n                registers: [register]\n            }),\n            documentsProcessed: new prometheus.Counter({\n                name: 'mongodb_migration_documents_total',\n                help: 'Total documents processed',\n                labelNames: ['version', 'collection'],\n                registers: [register]\n            }),\n            migrationErrors: new prometheus.Counter({\n                name: 'mongodb_migration_errors_total',\n                help: 'Total migration errors',\n                labelNames: ['version', 'error_type'],\n                registers: [register]\n            }),\n            register\n        };\n    }\n\n    async migrate() {\n        await this.client.connect();\n        const db = this.client.db();\n\n        for (const [version, migration] of this.migrations) {\n            await this.executeMigrationWithObservability(db, version, migration);\n        }\n    }\n\n    async executeMigrationWithObservability(db, version, migration) {\n        const timer = this.metrics.migrationDuration.startTimer({ version });\n        const session = this.client.startSession();\n\n        try {\n            this.logger.info(`Starting migration ${version}`);\n\n            await session.withTransaction(async () => {\n                await migration.up(db, session, (collection, count) => {\n                    this.metrics.documentsProcessed.inc({\n                        version,\n                        collection\n                    }, count);\n                });\n            });\n\n            timer({ status: 'success' });\n            this.logger.info(`Migration ${version} completed`);\n\n        } catch (error) {\n            this.metrics.migrationErrors.inc({\n                version,\n                error_type: error.name\n            });\n            timer({ status: 'failed' });\n            throw error;\n        } finally {\n            await session.endSession();\n        }\n    }\n}\n```\n\n### 2. Change Data Capture with Debezium\n\n```python\nimport asyncio\nimport json\nfrom kafka import KafkaConsumer, KafkaProducer\nfrom prometheus_client import Counter, Histogram, Gauge\nfrom datetime import datetime\n\nclass CDCObservabilityManager:\n    def __init__(self, config):\n        self.config = config\n        self.metrics = self.setup_metrics()\n\n    def setup_metrics(self):\n        return {\n            'events_processed': Counter(\n                'cdc_events_processed_total',\n                'Total CDC events processed',\n                ['source', 'table', 'operation']\n            ),\n            'consumer_lag': Gauge(\n                'cdc_consumer_lag_messages',\n                'Consumer lag in messages',\n                ['topic', 'partition']\n            ),\n            'replication_lag': Gauge(\n                'cdc_replication_lag_seconds',\n                'Replication lag',\n                ['source_table', 'target_table']\n            )\n        }\n\n    async def setup_cdc_pipeline(self):\n        self.consumer = KafkaConsumer(\n            'database.changes',\n            bootstrap_servers=self.config['kafka_brokers'],\n            group_id='migration-consumer',\n            value_deserializer=lambda m: json.loads(m.decode('utf-8'))\n        )\n\n        self.producer = KafkaProducer(\n            bootstrap_servers=self.config['kafka_brokers'],\n            value_serializer=lambda v: json.dumps(v).encode('utf-8')\n        )\n\n    async def process_cdc_events(self):\n        for message in self.consumer:\n            event = self.parse_cdc_event(message.value)\n\n            self.metrics['events_processed'].labels(\n                source=event.source_db,\n                table=event.table,\n                operation=event.operation\n            ).inc()\n\n            await self.apply_to_target(\n                event.table,\n                event.operation,\n                event.data,\n                event.timestamp\n            )\n\n    async def setup_debezium_connector(self, source_config):\n        connector_config = {\n            \"name\": f\"migration-connector-{source_config['name']}\",\n            \"config\": {\n                \"connector.class\": \"io.debezium.connector.postgresql.PostgresConnector\",\n                \"database.hostname\": source_config['host'],\n                \"database.port\": source_config['port'],\n                \"database.dbname\": source_config['database'],\n                \"plugin.name\": \"pgoutput\",\n                \"heartbeat.interval.ms\": \"10000\"\n            }\n        }\n\n        response = requests.post(\n            f\"{self.config['kafka_connect_url']}\u002Fconnectors\",\n            json=connector_config\n        )\n```\n\n### 3. Enterprise Monitoring and Alerting\n\n```python\nfrom prometheus_client import Counter, Gauge, Histogram, Summary\nimport numpy as np\n\nclass EnterpriseMigrationMonitor:\n    def __init__(self, config):\n        self.config = config\n        self.registry = prometheus.CollectorRegistry()\n        self.metrics = self.setup_metrics()\n        self.alerting = AlertingSystem(config.get('alerts', {}))\n\n    def setup_metrics(self):\n        return {\n            'migration_duration': Histogram(\n                'migration_duration_seconds',\n                'Migration duration',\n                ['migration_id'],\n                buckets=[60, 300, 600, 1800, 3600],\n                registry=self.registry\n            ),\n            'rows_migrated': Counter(\n                'migration_rows_total',\n                'Total rows migrated',\n                ['migration_id', 'table_name'],\n                registry=self.registry\n            ),\n            'data_lag': Gauge(\n                'migration_data_lag_seconds',\n                'Data lag',\n                ['migration_id'],\n                registry=self.registry\n            )\n        }\n\n    async def track_migration_progress(self, migration_id):\n        while migration.status == 'running':\n            stats = await self.calculate_progress_stats(migration)\n\n            self.metrics['rows_migrated'].labels(\n                migration_id=migration_id,\n                table_name=migration.table\n            ).inc(stats.rows_processed)\n\n            anomalies = await self.detect_anomalies(migration_id, stats)\n            if anomalies:\n                await self.handle_anomalies(migration_id, anomalies)\n\n            await asyncio.sleep(30)\n\n    async def detect_anomalies(self, migration_id, stats):\n        anomalies = []\n\n        if stats.rows_per_second \u003C stats.expected_rows_per_second * 0.5:\n            anomalies.append({\n                'type': 'low_throughput',\n                'severity': 'warning',\n                'message': f'Throughput below expected'\n            })\n\n        if stats.error_rate > 0.01:\n            anomalies.append({\n                'type': 'high_error_rate',\n                'severity': 'critical',\n                'message': f'Error rate exceeds threshold'\n            })\n\n        return anomalies\n\n    async def setup_migration_dashboard(self):\n        dashboard_config = {\n            \"dashboard\": {\n                \"title\": \"Database Migration Monitoring\",\n                \"panels\": [\n                    {\n                        \"title\": \"Migration Progress\",\n                        \"targets\": [{\n                            \"expr\": \"rate(migration_rows_total[5m])\"\n                        }]\n                    },\n                    {\n                        \"title\": \"Data Lag\",\n                        \"targets\": [{\n                            \"expr\": \"migration_data_lag_seconds\"\n                        }]\n                    }\n                ]\n            }\n        }\n\n        response = requests.post(\n            f\"{self.config['grafana_url']}\u002Fapi\u002Fdashboards\u002Fdb\",\n            json=dashboard_config,\n            headers={'Authorization': f\"Bearer {self.config['grafana_token']}\"}\n        )\n\nclass AlertingSystem:\n    def __init__(self, config):\n        self.config = config\n\n    async def send_alert(self, title, message, severity, **kwargs):\n        if 'slack' in self.config:\n            await self.send_slack_alert(title, message, severity)\n\n        if 'email' in self.config:\n            await self.send_email_alert(title, message, severity)\n\n    async def send_slack_alert(self, title, message, severity):\n        color = {\n            'critical': 'danger',\n            'warning': 'warning',\n            'info': 'good'\n        }.get(severity, 'warning')\n\n        payload = {\n            'text': title,\n            'attachments': [{\n                'color': color,\n                'text': message\n            }]\n        }\n\n        requests.post(self.config['slack']['webhook_url'], json=payload)\n```\n\n### 4. Grafana Dashboard Configuration\n\n```python\ndashboard_panels = [\n    {\n        \"id\": 1,\n        \"title\": \"Migration Progress\",\n        \"type\": \"graph\",\n        \"targets\": [{\n            \"expr\": \"rate(migration_rows_total[5m])\",\n            \"legendFormat\": \"{{migration_id}} - {{table_name}}\"\n        }]\n    },\n    {\n        \"id\": 2,\n        \"title\": \"Data Lag\",\n        \"type\": \"stat\",\n        \"targets\": [{\n            \"expr\": \"migration_data_lag_seconds\"\n        }],\n        \"fieldConfig\": {\n            \"thresholds\": {\n                \"steps\": [\n                    {\"value\": 0, \"color\": \"green\"},\n                    {\"value\": 60, \"color\": \"yellow\"},\n                    {\"value\": 300, \"color\": \"red\"}\n                ]\n            }\n        }\n    },\n    {\n        \"id\": 3,\n        \"title\": \"Error Rate\",\n        \"type\": \"graph\",\n        \"targets\": [{\n            \"expr\": \"rate(migration_errors_total[5m])\"\n        }]\n    }\n]\n```\n\n### 5. CI\u002FCD Integration\n\n```yaml\nname: Migration Monitoring\n\non:\n  push:\n    branches: [main]\n\njobs:\n  monitor-migration:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Start Monitoring\n        run: |\n          python migration_monitor.py start \\\n            --migration-id ${{ github.sha }} \\\n            --prometheus-url ${{ secrets.PROMETHEUS_URL }}\n\n      - name: Run Migration\n        run: |\n          python migrate.py --environment production\n\n      - name: Check Migration Health\n        run: |\n          python migration_monitor.py check \\\n            --migration-id ${{ github.sha }} \\\n            --max-lag 300\n```\n\n## Output Format\n\n1. **Observable MongoDB Migrations**: Atlas framework with metrics and validation\n2. **CDC Pipeline with Monitoring**: Debezium integration with Kafka\n3. **Enterprise Metrics Collection**: Prometheus instrumentation\n4. **Anomaly Detection**: Statistical analysis\n5. **Multi-channel Alerting**: Email, Slack, PagerDuty integrations\n6. **Grafana Dashboard Automation**: Programmatic dashboard creation\n7. **Replication Lag Tracking**: Source-to-target lag monitoring\n8. **Health Check Systems**: Continuous pipeline monitoring\n\nFocus on real-time visibility, proactive alerting, and comprehensive observability for zero-downtime migrations.\n\n## Cross-Plugin Integration\n\nThis plugin integrates with:\n- **sql-migrations**: Provides observability for SQL migrations\n- **nosql-migrations**: Monitors NoSQL transformations\n- **migration-integration**: Coordinates monitoring across workflows\n",{"name":5,"risk":38,"tags":37,"source":36,"date_added":45,"description":7},"2026-02-27","main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fcursor\u002Fdatabase-migrations-migration-observability","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill database-migrations-migration-observability",{"tool":58,"command":59},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill database-migrations-migration-observability",{"tool":61,"command":62},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill database-migrations-migration-observability","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcursor\u002Fdatabase-migrations-migration-observability\u002FSKILL.md",true,[],[67,91,117,127,140,157],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":78,"publishedAt":40},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[73],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[79,80,81,82,83,84,85,86,87,88,89,90],"wechat search","wechat","search","capabilities","openclaw","design","web search","compliance","web","official","fetch","with",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":40},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[98,99,100,101,102,103,81,104,105,106,107,108,109,110,111,112,113,114,115,116],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","when","brew","live","data","google","install","read","across","api",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":40},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[124,125,98,109,110,111,112,102,81,114,126,115,116,108,106,105,104,113,103,101],"trend radar","radar","pulse",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":40},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[134,135,136,137,138,139],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":149,"publishedAt":40},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[146],{"categoryNo":147,"categoryName":148,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[142,87,150,151,152,90,109,153,154,155,100,156,113],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":163,"publishedAt":40},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[159,164,165,166,113,167,154,168,169,170,171,172],"status","play","go","latest","github","discover","control","cmd","volume"]