[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71S2FG9PW207T5YWZVB43GT":3,"skill-same:01M71S2FG9PW207T5YWZVB43GT":71},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":13,"repositoryHtmlUrl":54,"repositoryHomepageUrl":6,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":56,"install":57,"resources":70},"01M71S2FG9PW207T5YWZVB43GT","database-migrations-migration-observability",null,"Migration monitoring, CDC, and observability infrastructure","javiertarazon\u002Fide-agente-free-jt7-","javiertarazon","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F153141207?v=4","01M71R52TB3S9HXKH6WSNT8A7V","01M71R52VG5KS2DKDDH4GDQ30A",0,"MIT","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fdatabase-migrations-migration-observability\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"database migrations migration observability","database","migrations","migration","database migrations","observability","infrastructure","edit","write","cdc","read","webfetch","monitoring","grafana","Bash","unknown","database, cdc, debezium, kafka, prometheus, grafana, monitoring","kafka","prometheus","community","2026-11-10 13:02:02",false,"---\nname: database-migrations-migration-observability\ndescription: \"Migration monitoring, CDC, and observability infrastructure\"\nallowed-tools: Read Write Edit Bash WebFetch\nmetadata:\n  version: 1.0.0\n  tags: database, cdc, debezium, kafka, prometheus, grafana, monitoring\nrisk: unknown\nsource: community\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,"source":42,"metadata":48,"description":7,"allowed-tools":50},{"tags":39,"version":49},"1.0.0","Read Write Edit Bash WebFetch","release\u002Fv4.2.11-panel-pro","a92ea02bcf7e2b3dbaf46d49696c29a3cb490d4f",".github\u002Fskills\u002Fdatabase-migrations-migration-observability","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-","https:\u002F\u002Fgithub.com\u002Fjaviertarazon","2026-07-12 07:10:45",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add javiertarazon\u002Fide-agente-free-jt7- --skill database-migrations-migration-observability",{"tool":63,"command":64},"bunx","bunx skills add javiertarazon\u002Fide-agente-free-jt7- --skill database-migrations-migration-observability",{"tool":66,"command":67},"pnpm","pnpm dlx skills add javiertarazon\u002Fide-agente-free-jt7- --skill database-migrations-migration-observability","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fdatabase-migrations-migration-observability\u002FSKILL.md",true,[],[72,100,127,147,162,184],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":81,"publishedAt":43},"01M71TQ7Q6Z10VWF3C2H5X1KW9","zustand-store-ts","Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state\u002Faction separation. Use when building React state management, creating global stores, or implementing reacti...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzustand-store-ts\u002FSKILL.md",[78],{"categoryNo":79,"categoryName":80,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",[82,83,84,42,85,86,87,88,89,38,90,91,92,93,94,95,96,97,98,99],"zustand","store","zustand store ts","middleware","implementing","use","react state management","when","react","with","state","create","state management","typescript","action","management","separation","global",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":109,"publishedAt":43},"01M71TQ5EAR40G6W0MV5ZDVEZT","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoom-automation\u002FSKILL.md",[106],{"categoryNo":107,"categoryName":108,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[110,111,112,42,113,114,115,116,117,38,118,119,120,121,122,123,124,125,97,126],"zoom automation","zoom","automation","creation","for","search","schemas","MCP","first","via","meeting","search tools","tracking","webinars","composio","recordings","Tools",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":134,"publishedAt":43},"01M71TQ29B1EYBCEAP1ZBGXQ1A","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoho-crm-automation\u002FSKILL.md",[133],{"categoryNo":107,"categoryName":108,"taxonomyType":20,"taxonomyTypeDesc":21},[135,136,112,137,138,139,42,140,141,114,142,115,116,143,117,38,144,145,146,93],"crm automation","zoho crm automation","crm","zoho crm","zoho","leads","manage leads","manage","records","convert","tasks","contacts",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":154,"publishedAt":43},"01M71TPZPMN60DH0XV58KVHY23","zendesk-automation","Automate Zendesk tasks via Rube MCP (Composio): tickets, users, organizations, replies. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzendesk-automation\u002FSKILL.md",[153],{"categoryNo":107,"categoryName":108,"taxonomyType":20,"taxonomyTypeDesc":21},[155,112,156,42,114,115,116,117,157,38,145,158,159,118,119,160,121,124,126,161],"zendesk automation","zendesk","organizations","replies","users","tickets","automate",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":43},"01M71TPXDWKHKG4N6TVEPXWD0N","zapier-make-patterns","No-code automation democratizes workflow building. Zapier and Make (formerly Integromat) let non-developers automate business processes without writing code. But no-code doesn't mean no-complexity ...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzapier-make-patterns\u002FSKILL.md",[],[169,170,171,172,173,174,175,176,177,112,178,38,179,180,181,182,183,161],"zapier make patterns","zapier","patterns","make","No-Code","complexity","writing","spawner","business","workflow","code","integromat","apache","processes","but",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":193,"publishedAt":43},"01M71TPT5T10WXNKW9G7ZXZ27W","youtube-summarizer","Extract transcripts from YouTube videos and generate comprehensive, detailed summaries using intelligent analysis frameworks","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fyoutube-summarizer\u002FSKILL.md",[190],{"categoryNo":191,"categoryName":192,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",[194,195,196,197,42,198,199,200,201,202,203,204,179,205,206,207,208,209,210,211],"summarizer","youtube","youtube summarizer","Video","content-analysis","frameworks","copilot","2025","github-copilot","extract transcripts","analysis","codex","cli","summaries","github","generate","summarization","2026"]