Руководство по мониторингу

В этом руководстве рассматриваются вопросы мониторинга, сбора метрик и проверки работоспособности CodeGraph в производственных средах.

Содержание

Обзор

Модуль мониторинга (src/monitoring/) предоставляет: - Метрики Prometheus — 20 метрик для отслеживания состояния системы - Структурированное JSON-логированиеStructuredLogger с контекстным менеджером timed_operation() - Конечные точки проверки работоспособности — standalone FastAPI-приложение и API-роутер - Декораторы мониторингаmonitor_scenario, monitor_agent, monitor_cache - Функции записиrecord_llm_call, record_cpg_query, record_retrieval - MetricsCollector — синглтон для агрегации метрик в памяти - MetricsMiddleware — автоматическая инструментация HTTP-запросов


Быстрый старт

Включение метрик

from src.monitoring import (
    MetricsCollector,
    StructuredLogger,
    monitor_scenario,
    monitor_agent,
    monitor_cache,
    record_llm_call,
)

# Создание структурированного логера
logger = StructuredLogger("my_component")

# Получение сборщика метрик (синглтон)
metrics = MetricsCollector()

# Использование декораторов для автоматического отслеживания
@monitor_scenario("my_scenario")
def process_query(query: str):
    # Автоматически записывает SCENARIO_DURATION, SCENARIO_SUCCESS/FAILURE,
    # ACTIVE_REQUESTS, TOTAL_REQUESTS
    return result

Приложение проверки работоспособности

from src.monitoring.health import create_health_app

# Создание standalone FastAPI-приложения для проверки работоспособности
app = create_health_app()

# Доступные конечные точки:
# GET /health       - Общий статус работоспособности
# GET /health/live  - Проверка активности
# GET /health/ready - Проверка готовности
# GET /metrics      - Метрики Prometheus
# GET /stats        - Статистика системы

Метрики Prometheus

Доступные метрики

Метрика Тип Метки Описание
rag_scenario_duration_seconds Histogram scenario_name Время выполнения сценария
rag_scenario_success_total Counter scenario_name Успешные выполнения
rag_scenario_failure_total Counter scenario_name, error_type Неудачные выполнения
rag_agent_duration_seconds Histogram agent_name, scenario Время выполнения агента
rag_agent_success_total Counter agent_name, scenario Успешные действия агента
rag_agent_failure_total Counter agent_name, scenario, error_type Сбои агента
rag_cache_hits_total Counter cache_type Попадания в кеш
rag_cache_misses_total Counter cache_type Промахи кеша
rag_cache_size Gauge cache_type Текущий размер кеша
rag_active_requests Gauge Активные запросы в обработке
rag_total_requests Counter Общее количество обработанных запросов
rag_llm_latency_seconds Histogram model, operation Задержка вызовов LLM API
rag_llm_tokens_total Counter model, token_type Использованные токены LLM
rag_llm_errors_total Counter model, error_type Ошибки LLM API
rag_cpg_query_latency_seconds Histogram query_type Задержка CPG-запросов
rag_cpg_query_results Histogram query_type Количество результатов CPG-запросов
rag_retrieval_latency_seconds Histogram retrieval_type Задержка операций поиска
rag_retrieval_results_count Histogram retrieval_type Количество результатов поиска

Всего: 18 метрик (все определены в src/monitoring/metrics.py). ACTIVE_REQUESTS и TOTAL_REQUESTS не имеют меток.

Интервалы гистограмм

# SCENARIO_DURATION (секунды)
(0.5, 1.0, 2.0, 5.0, 10.0, 30.0, 60.0, 120.0)

# AGENT_DURATION (секунды)
(0.1, 0.5, 1.0, 2.0, 5.0, 10.0)

# LLM_LATENCY (секунды)
(0.1, 0.5, 1.0, 2.0, 3.0, 5.0, 10.0)

# CPG_QUERY_LATENCY (секунды)
(0.01, 0.05, 0.1, 0.5, 1.0, 2.0, 5.0)

# CPG_QUERY_RESULTS (количество)
(0, 1, 5, 10, 50, 100, 500, 1000)

# RETRIEVAL_LATENCY (секунды)
(0.1, 0.5, 1.0, 2.0, 5.0)

# RETRIEVAL_RESULTS (количество)
(0, 1, 5, 10, 20, 50)

Запись метрик

from src.monitoring.metrics import (
    SCENARIO_DURATION,
    SCENARIO_SUCCESS,
    SCENARIO_FAILURE,
    LLM_LATENCY,
    LLM_TOKENS,
    LLM_ERRORS,
    CACHE_HITS,
    CACHE_MISSES,
)

# Запись времени выполнения сценария
with SCENARIO_DURATION.labels(scenario_name="security_audit").time():
    result = run_scenario()

SCENARIO_SUCCESS.labels(scenario_name="security_audit").inc()

# Запись использования LLM
LLM_LATENCY.labels(model="GigaChat-2-Pro", operation="generate").observe(2.5)
LLM_TOKENS.labels(model="GigaChat-2-Pro", token_type="output").inc(150)
LLM_ERRORS.labels(model="GigaChat-2-Pro", error_type="timeout").inc()

# Запись обращений к кешу
CACHE_HITS.labels(cache_type="query_plan").inc()
CACHE_MISSES.labels(cache_type="embedding").inc()

Функции записи

Вспомогательные функции для одновременной записи нескольких метрик:

from src.monitoring import record_llm_call, record_cpg_query, record_retrieval

# Запись вызова LLM (обновляет LLM_LATENCY, LLM_TOKENS, LLM_ERRORS)
record_llm_call(
    model="GigaChat-2-Pro",
    operation="generate",
    duration=2.5,
    input_tokens=100,
    output_tokens=150,
    error=None,  # или строка с типом ошибки при сбое
)

# Запись CPG-запроса (обновляет CPG_QUERY_LATENCY, CPG_QUERY_RESULTS)
record_cpg_query(
    query_type="method_lookup",
    duration=0.05,
    result_count=12,
)

# Запись операции поиска (обновляет RETRIEVAL_LATENCY, RETRIEVAL_RESULTS)
record_retrieval(
    retrieval_type="hybrid",
    duration=1.2,
    result_count=10,
)

Декораторы

@monitor_scenario

Автоматически отслеживает выполнение сценария: длительность, успех/неудачу, активные запросы.

from src.monitoring import monitor_scenario

@monitor_scenario("security_audit")
def run_security_audit(codebase: str):
    # Записывает:
    # - SCENARIO_DURATION.labels(scenario_name="security_audit")
    # - SCENARIO_SUCCESS / SCENARIO_FAILURE
    # - ACTIVE_REQUESTS inc/dec
    # - TOTAL_REQUESTS inc
    return findings

Параметры: scenario_name: str — имя сценария.

@monitor_agent

Отслеживает выполнение агента с контекстом сценария.

from src.monitoring import monitor_agent

@monitor_agent("retriever_agent", scenario="security")
def retrieve_context(query: str) -> list:
    # Записывает:
    # - AGENT_DURATION.labels(agent_name="retriever_agent", scenario="security")
    # - AGENT_SUCCESS / AGENT_FAILURE
    return results

Параметры: agent_name: str, scenario: str = "unknown".

@monitor_cache

Отслеживает попадания/промахи кеша по возвращаемому значению (None = промах, иначе = попадание).

from src.monitoring import monitor_cache

@monitor_cache("query_plan")
def get_cached_query(key: str) -> dict | None:
    # Записывает:
    # - CACHE_HITS.labels(cache_type="query_plan") при непустом возврате
    # - CACHE_MISSES.labels(cache_type="query_plan") при возврате None
    return cached_result

Параметры: cache_type: str = "query_plan".


MetricsCollector

Синглтон для агрегации метрик в памяти. Используется, когда сервер Prometheus недоступен.

from src.monitoring import MetricsCollector, get_metrics_collector

# Оба возвращают один и тот же экземпляр-синглтон
collector = MetricsCollector()
collector = get_metrics_collector()

# Запись метрик
collector.record_latency("query_generation", 0.245)
collector.record_scenario("security_audit", success=True, latency=1.5)
collector.record_cache_access("query_plan", hit=True)
collector.increment_counter("total_queries", amount=1)
collector.set_gauge("active_requests", 5.0)

# Получение сводки
summary = collector.get_summary()  # Возвращает MetricsSummary
stats = collector.get_scenario_stats()  # Статистика по сценариям
cache = collector.get_cache_stats()  # Статистика по типам кеша
uptime = collector.get_uptime_seconds()

# Сброс всех собранных метрик
collector.reset()

MetricsSummary

Датакласс, возвращаемый MetricsCollector.get_summary():

Поле Тип Описание
total_requests int Общее количество выполнений сценариев
successful_requests int Успешные выполнения
failed_requests int Неудачные выполнения
success_rate float Доля успешных (0.0–1.0)
avg_latency_ms float Средняя задержка в мс
p50_latency_ms float Задержка 50-го перцентиля
p95_latency_ms float Задержка 95-го перцентиля
p99_latency_ms float Задержка 99-го перцентиля
cache_hit_rate float Доля попаданий в кеш (0.0–1.0)
active_requests int Текущие активные запросы
summary = collector.get_summary()
data = summary.to_dict()  # Преобразование в словарь для JSON-сериализации

Проверки работоспособности

Статус работоспособности

from src.monitoring.health import HealthStatus

class HealthStatus(Enum):
    HEALTHY = "healthy"
    DEGRADED = "degraded"
    UNHEALTHY = "unhealthy"

Работоспособность компонентов

Система проверяет следующие компоненты по умолчанию:

HealthChecker (standalone): зарегистрированы через _register_default_checks():

Компонент Метод проверки Описание
database _check_database Подключение к DuckDB CPG
llm _check_llm Ответ поставщика LLM
llm_providers _check_llm_providers Доступные модули поставщиков LLM
quality _check_quality Качество RAG через обратную связь

API Router (src/api/routers/health.py):

Компонент Функция проверки Описание
database DatabaseHealthCheck.check() База данных PostgreSQL
llm check_llm_health() Конфигурация поставщика LLM
chromadb check_chromadb_health() Векторное хранилище ChromaDB
cpg check_cpg_health() База данных DuckDB CPG

Пользовательские проверки

from src.monitoring.health import HealthChecker, ComponentHealth, HealthStatus

checker = HealthChecker()

def check_custom_service():
    try:
        response_time = ping_service()
        if response_time < 100:
            return ComponentHealth(
                name="custom_service",
                status=HealthStatus.HEALTHY,
                latency_ms=response_time
            )
        else:
            return ComponentHealth(
                name="custom_service",
                status=HealthStatus.DEGRADED,
                latency_ms=response_time,
                message="Высокая задержка"
            )
    except Exception as e:
        return ComponentHealth(
            name="custom_service",
            status=HealthStatus.UNHEALTHY,
            message=str(e)
        )

checker.register_check("custom_service", check_custom_service)

Конечные точки — Standalone-приложение

Создаётся через create_health_app() из src/monitoring/health:

Конечная точка Описание
GET /health Общий статус работоспособности
GET /health/live Проверка активности
GET /health/ready Проверка готовности
GET /metrics Метрики Prometheus
GET /stats Статистика системы

GET /health — ответ:

{
  "status": "healthy",
  "timestamp": 1702580000.0,
  "uptime_seconds": 3600.0,
  "version": "2.0.0",
  "components": [
    {
      "name": "database",
      "status": "healthy",
      "latency_ms": 2.5,
      "message": "Connected, 1500 methods",
      "details": {}
    },
    {
      "name": "llm",
      "status": "healthy",
      "latency_ms": 450.0,
      "message": "LLM responding normally",
      "details": {"provider": "yandex"}
    }
  ]
}

GET /health/live — ответ:

{"status": "alive"}

GET /health/ready — ответ:

{"status": "ready"}

GET /stats — ответ:

{
  "summary": {"total_requests": 100, "success_rate": 0.95, "...": "..."},
  "scenarios": {"security_audit": {"total_requests": 50, "success_rate": 0.98}},
  "cache": {"query_plan": {"hits": 80, "misses": 20, "hit_rate": 0.8}},
  "uptime_seconds": 3600.0
}

Конечные точки — API Router

Подключены к /api/v1/health в основном FastAPI-приложении:

Конечная точка Описание
GET /api/v1/health Полная проверка (компоненты в виде словаря)
GET /api/v1/health/live Проверка активности
GET /api/v1/health/ready Проверка готовности (проверяет БД)
GET /api/v1/health/version Версия API
GET /api/v1/metrics Метрики Prometheus (отдельный роутер)

GET /api/v1/health — ответ:

{
  "status": "healthy",
  "version": "2.0.0",
  "uptime_seconds": 3600.0,
  "timestamp": "2026-03-07T10:30:00Z",
  "components": {
    "database": {"status": "healthy"},
    "llm": {"status": "healthy", "provider": "yandex"},
    "chromadb": {"status": "healthy", "collections": 5},
    "cpg": {"status": "healthy", "db_path": "/data/project.duckdb", "methods": 1500}
  }
}

Примечание: в API-роутере components — это словарь (ключи — имена компонентов), а не массив.

Автономные функции

Функции быстрой проверки для использования вне фреймворка проверки работоспособности:

from src.monitoring.health import (
    check_database_connection,
    check_llm_availability,
    check_vector_store,
    run_health_check_cli,
)

# Быстрые логические проверки
db_ok = check_database_connection()    # True, если DuckDB отвечает на SELECT 1
llm_ok = check_llm_availability()      # True, если LLM is_available()
vs_ok = check_vector_store()           # True, если ChromaDB heartbeat успешен

# Проверка работоспособности из CLI (выводит отчёт, завершается с кодом 0/1/2)
run_health_check_cli()

Структурированное логирование

StructuredLogger

JSON-логер для производственных сред. Выводит структурированные данные, совместимые с Elasticsearch, Splunk или CloudWatch.

from src.monitoring import StructuredLogger

logger = StructuredLogger("my_component")

# Логирование со структурированными данными
logger.info("Processing request", request_id="abc123", user="test")
logger.warning("Slow query", duration_ms=500)
logger.error("Failed to connect", service="database", error="timeout")

Методы: debug(), info(), warning(), error(), critical() — все принимают message: str и произвольные **kwargs.

Формат логов

{
  "timestamp": "2026-03-07T10:30:00.000Z",
  "level": "INFO",
  "logger": "my_component",
  "message": "Processing request",
  "request_id": "abc123",
  "user": "test"
}

Замер операций

Контекстный менеджер для замера операций с автоматическим логированием успеха/ошибки:

from src.monitoring import StructuredLogger

logger = StructuredLogger("query_engine")

with logger.timed_operation("query_generation", scenario="security"):
    result = generate_query()
    # При успехе логирует:
    # {"message": "Operation completed: query_generation",
    #  "operation": "query_generation", "duration_ms": 245.0,
    #  "status": "success", "scenario": "security"}

    # При исключении логирует ошибку с status="error", error_type, error_message
    # и пробрасывает исключение дальше

MetricsMiddleware

HTTP-мидлварь, автоматически записывающая метрики Prometheus для каждого запроса. Определена в src/api/middleware/metrics.py.

from src.api.middleware.metrics import MetricsMiddleware

app.add_middleware(MetricsMiddleware)

Метрики, записываемые для каждого запроса: - ACTIVE_REQUESTS — увеличивается на входе, уменьшается на выходе (gauge) - TOTAL_REQUESTS — увеличивается на входе (counter) - SCENARIO_DURATION — записывает длительность запроса с меткой scenario_name=f"http:{path}"


Панели Grafana

Рекомендуемые панели

Частота запросов:

rate(rag_scenario_success_total[5m]) + rate(rag_scenario_failure_total[5m])

Частота ошибок:

rate(rag_scenario_failure_total[5m]) / (rate(rag_scenario_success_total[5m]) + rate(rag_scenario_failure_total[5m]))

Задержка P95:

histogram_quantile(0.95, rate(rag_scenario_duration_seconds_bucket[5m]))

Использование токенов LLM:

sum(rate(rag_llm_tokens_total[1h])) by (model)

Процент попаданий в кеш:

rate(rag_cache_hits_total[5m]) / (rate(rag_cache_hits_total[5m]) + rate(rag_cache_misses_total[5m]))

Частота ошибок LLM:

sum(rate(rag_llm_errors_total[5m])) by (model, error_type)

Активные запросы:

rag_active_requests

Правила оповещений

Реальные правила оповещений из monitoring/rules/alerts.yml:

groups:
  - name: codegraph_availability
    rules:
      - alert: CodeGraphAPIDown
        expr: up{job="codegraph-api"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "CodeGraph API недоступен"

      - alert: CodeGraphHighErrorRate
        expr: |
          (
            sum(rate(rag_scenario_failure_total[5m]))
            / (sum(rate(rag_scenario_success_total[5m])) + sum(rate(rag_scenario_failure_total[5m])))
          ) > 0.25
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Высокая частота ошибок сценариев (>25%)"

  - name: codegraph_latency
    rules:
      - alert: CodeGraphHighLatency
        expr: histogram_quantile(0.95, sum(rate(rag_scenario_duration_seconds_bucket[5m])) by (le)) > 30
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Высокая задержка сценариев (p95 > 30 с)"

      - alert: CodeGraphLLMSlowResponses
        expr: histogram_quantile(0.95, sum(rate(rag_llm_latency_seconds_bucket[5m])) by (le)) > 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Высокая задержка ответов LLM (p95 > 10 с)"

  - name: codegraph_resources
    rules:
      - alert: CodeGraphHighActiveRequests
        expr: rag_active_requests > 50
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Большое количество активных запросов (>50)"

      - alert: CodeGraphLLMErrors
        expr: sum(rate(rag_llm_errors_total[5m])) > 0.1
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Обнаружены ошибки LLM"

  - name: codegraph_infrastructure
    rules:
      - alert: PrometheusTargetDown
        expr: up == 0
        for: 3m
        labels:
          severity: critical
        annotations:
          summary: "Цель Prometheus {{ $labels.job }} недоступна"

Alertmanager

Конфигурация Alertmanager в monitoring/alertmanager.yml:

  • Маршрутизация: группировка оповещений по alertname и severity. Критические оповещения повторяются каждый 1 час, остальные — каждые 4 часа.
  • Получатель: webhook по умолчанию через ${ALERTMANAGER_WEBHOOK_URL} с send_resolved: true. Поддержка Slack и email (закомментированы по умолчанию).
  • Правила подавления: критические оповещения подавляют предупреждения с тем же alertname.

Yandex Cloud Dashboard

monitoring/yandex/dashboard.json содержит готовый дашборд для Yandex Monitoring с метриками CodeGraph.


Интеграция с Kubernetes

Конфигурация развертывания

apiVersion: apps/v1
kind: Deployment
metadata:
  name: codegraph
spec:
  template:
    spec:
      containers:
        - name: codegraph
          ports:
            - containerPort: 8000
              name: api
          livenessProbe:
            httpGet:
              path: /api/v1/health/live
              port: api
            initialDelaySeconds: 30
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /api/v1/health/ready
              port: api
            initialDelaySeconds: 10
            periodSeconds: 5

ServiceMonitor для Prometheus

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: codegraph
spec:
  selector:
    matchLabels:
      app: codegraph
  endpoints:
    - port: api
      path: /api/v1/metrics
      interval: 30s

Рекомендации

  1. Используйте декораторы (monitor_scenario, monitor_agent, monitor_cache) для автоматической инструментации
  2. Используйте StructuredLogger.timed_operation() для замера и логирования длительности операций
  3. Используйте функции записи (record_llm_call, record_cpg_query, record_retrieval) вместо прямого увеличения счётчиков
  4. Отслеживайте использование токенов через LLM_TOKENS для контроля расходов
  5. Анализируйте задержки P95/P99, а не только средние значения
  6. Настраивайте пороги оповещений в соответствии с SLO (текущие: частота ошибок >25%, задержка p95 >30 с)
  7. Используйте MetricsCollector для агрегации метрик в памяти, когда Prometheus не развёрнут

Grafana-дашборд CISO/CTO

Дашборд CISO/CTO обеспечивает обзор состояния безопасности и качества кода всех зарегистрированных проектов на уровне руководства. Поставляется в виде готовой JSON-модели Grafana: grafana/dashboard_ciso.json.

Импорт

  1. Откройте Grafana и перейдите в Dashboards > Import.
  2. Загрузите grafana/dashboard_ciso.json или вставьте его содержимое.
  3. Выберите источник данных Prometheus, настроенный для метрик CodeGraph.
  4. Нажмите Import. Дашборд появится в папке CodeGraph.

Источник данных

Дашборд требует источник данных Prometheus, направленный на стандартную конечную точку метрик CodeGraph:

/api/v1/metrics

Автообновление по умолчанию установлено на 5 минут. При необходимости измените в Dashboard Settings > Time Options.

Переменные

В заголовке дашборда доступны две шаблонные переменные для фильтрации:

Переменная Описание По умолчанию
$group Имя группы проектов. Фильтрует все панели, показывая только проекты выбранной группы. All
$project Имя конкретного проекта. При выборе панели показывают данные только по этому проекту. All

Панели (12)

Панель Тип Описание
1 Работоспособность портфеля Stat Среднее значение codegraph_project_health_score по всем проектам (с фильтром $group). Пороги цвета: зелёный >=70, жёлтый >=50, красный <50.
2 Распределение рисков Pie chart Распределение проектов по уровню риска (критический, высокий, средний, низкий) на основе диапазонов оценки работоспособности.
3 Количество в красной зоне Stat Число проектов с codegraph_project_health_score < 50. Отображается красным, если count > 0.
4 SCA-уязвимости Stat Сумма codegraph_project_sca_vulnerabilities по всем проектам. Пороги: зелёный 0, жёлтый >=1, красный >=5.
5 Оценка аудита Bar gauge codegraph_project_audit_score по каждому проекту в виде горизонтальных столбцов, отсортированных по возрастанию.
6 Оценка соответствия Bar gauge codegraph_project_compliance_score по каждому проекту в виде горизонтальных столбцов, отсортированных по возрастанию.
7 Готовность к релизу Pie chart Распределение значений codegraph_project_release_status: готов (1), заблокирован (0), неизвестно (-1).
8 Красная зона по категориям Table / bar Использует codegraph_red_zone_items_count с группировкой по project и category, чтобы показать, где именно портфель деградирует.
9 Тренд работоспособности Time series codegraph_project_health_score во времени для выбранного $project или усреднённое по $group.
10 Тренд соответствия Time series codegraph_project_compliance_score во времени для выбранного $project или усреднённое по $group.
11 Топ-5 худших проектов Table Пять проектов с наименьшим codegraph_project_health_score. Столбцы: имя проекта, оценка работоспособности, оценка аудита, оценка соответствия, уровень риска.
12 Топ-5 лучших проектов Table Пять проектов с наибольшим codegraph_project_health_score. Столбцы аналогичны панели «Топ-5 худших».

Совместимость с темами

Все панели используют пороговые цвета, корректно отображающиеся как в тёмной, так и в светлой теме Grafana. Пользовательские CSS-переопределения не требуются.


Правила оповещений дашборда

Пять правил оповещений Prometheus определены в monitoring/rules/dashboard_alerts.yml для уведомления о превышении проектами пороговых значений риска. Эти правила дополняют существующие оповещения о доступности и задержках CodeGraph.

Имя оповещения Условие (PromQL) Длительность (for) Критичность Рекомендованное действие
DashboardProjectRiskCritical codegraph_project_health_score < 30 10m critical Немедленно проверить проект. Исследовать критические SCA-уязвимости, неуспешные проверки контроля релизов и пробелы в соответствии. Эскалировать ответственному руководителю группы.
DashboardProjectRiskHigh codegraph_project_health_score < 50 30m warning Запланировать проверку по устранению замечаний в течение 48 часов. Проверить находки аудита по критичности и устранить приоритетные в первую очередь.
DashboardComplianceGap codegraph_project_compliance_score < 40 1h warning Запустить полную оценку соответствия ГОСТ Р 56939 (codegraph_compliance_gost). Сосредоточиться на несоответствующих процессах, показанных в тепловой карте соответствия.
DashboardReleaseGateFail codegraph_project_release_status == 0 15m warning Проверить причины блокировки контроля релизов через codegraph_release_gate_check. Устранить блокирующие проверки до следующего окна релиза.
DashboardScaCriticalVuln codegraph_project_sca_vulnerabilities{severity="critical"} > 0 5m critical Немедленно исправить критические CVE. Запустить codegraph_sbom_audit для выявления затронутых зависимостей. Рассмотреть экстренный релиз, если затронуто рабочее окружение.

Пример конфигурации правил

groups:
  - name: codegraph_dashboard
    rules:
      - alert: DashboardProjectRiskCritical
        expr: codegraph_project_health_score < 30
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "Project {{ $labels.project }} health score critically low ({{ $value }})"
          runbook: "Check audit, SCA, and compliance status. Escalate to team lead."

      - alert: DashboardProjectRiskHigh
        expr: codegraph_project_health_score < 50
        for: 30m
        labels:
          severity: warning
        annotations:
          summary: "Project {{ $labels.project }} in red zone (health {{ $value }})"

      - alert: DashboardComplianceGap
        expr: codegraph_project_compliance_score < 40
        for: 1h
        labels:
          severity: warning
        annotations:
          summary: "Project {{ $labels.project }} compliance score below 40% ({{ $value }})"

      - alert: DashboardReleaseGateFail
        expr: codegraph_project_release_status == 0
        for: 15m
        labels:
          severity: warning
        annotations:
          summary: "Project {{ $labels.project }} release gate blocked"

      - alert: DashboardScaCriticalVuln
        expr: codegraph_project_sca_vulnerabilities{severity="critical"} > 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Project {{ $labels.project }} has {{ $value }} critical SCA vulnerabilities"

Метрики дашборда V2

Восемь dashboard-gauge публикуются через стандартную Prometheus scrape endpoint. Все метрики имеют тип Gauge и обновляются при выполнении dashboard aggregation logic.

codegraph_project_health_score

Составная оценка работоспособности проекта, агрегированная из подоценок аудита, соответствия, контроля релизов и SCA.

Свойство Значение
Тип Gauge
Метки project, group, language
Единица процент
Диапазон 0.0 – 100.0
# Проекты с оценкой ниже 50 (красная зона)
codegraph_project_health_score < 50

# Средняя оценка по всем проектам в группе
avg(codegraph_project_health_score{group="backend"})

codegraph_project_audit_score

Последняя оценка аудита проекта, основанная на 12-мерной оценке аудита.

Свойство Значение
Тип Gauge
Метки project
Единица score
Диапазон 0.0 – 10.0
# 5 худших проектов по оценке аудита
bottomk(5, codegraph_project_audit_score)

codegraph_project_compliance_score

Оценка соответствия ГОСТ Р 56939 для проекта, выраженная как процент пройденных процессов.

Свойство Значение
Тип Gauge
Метки project
Единица процент
Диапазон 0.0 – 100.0
# Проекты с соответствием ниже 40%
codegraph_project_compliance_score < 40

codegraph_project_release_status

Статус release gate проекта. Числовое значение: 1.0 = pass, 0.5 = warn, 0.0 = fail.

Свойство Значение
Тип Gauge
Метки project
Единица перечисление (1.0/0.5/0.0)
Диапазон 0.0 – 1.0
# Количество проектов со статусом fail
count(codegraph_project_release_status == 0)

codegraph_project_sca_health

Оценка работоспособности SCA (композиционный анализ) проекта, основанная на анализе уязвимостей зависимостей.

Свойство Значение
Тип Gauge
Метки project
Единица процент
Диапазон 0.0 – 100.0
# Проекты с SCA-оценкой ниже 70
codegraph_project_sca_health < 70

codegraph_project_sca_vulnerabilities

Количество SCA-уязвимостей проекта с разбивкой по критичности.

Свойство Значение
Тип Gauge
Метки project, severity
Единица количество
Диапазон 0 – не ограничен
# Общее количество критических уязвимостей по всем проектам
sum(codegraph_project_sca_vulnerabilities{severity="critical"})

# Количество уязвимостей по каждому проекту
sum by (project) (codegraph_project_sca_vulnerabilities)

codegraph_portfolio_avg_health

Средняя оценка работоспособности по всем зарегистрированным проектам с возможностью фильтрации по группе. Предварительно агрегированная метрика для удобства.

Свойство Значение
Тип Gauge
Метки group
Единица процент
Диапазон 0.0 – 100.0
# Работоспособность портфеля по всем группам
codegraph_portfolio_avg_health{group=""}

# Работоспособность по группе
codegraph_portfolio_avg_health{group="backend"}

codegraph_red_zone_items_count

Количество red-zone items с группировкой по проекту и категории.

Свойство Значение
Тип Gauge
Метки project, category
Единица количество
Диапазон 0 – не ограничен
# Оповещение при наличии release-related red-zone items
sum(codegraph_red_zone_items_count{category="release"}) > 0

Конечная точка метрик

Dashboard gauges доступны через стандартную Prometheus endpoint:

GET /api/v1/metrics

Ответ использует текстовый формат Prometheus:

# HELP codegraph_project_health_score Composite health score for a project
# TYPE codegraph_project_health_score gauge
codegraph_project_health_score{project="payments-api",group="backend"} 85.0
codegraph_project_health_score{project="legacy-auth",group="backend"} 35.0

# HELP codegraph_portfolio_avg_health Average health score across all projects
# TYPE codegraph_portfolio_avg_health gauge
codegraph_portfolio_avg_health{group=""} 72.5
codegraph_portfolio_avg_health{group="backend"} 60.0

# HELP codegraph_red_zone_items_count Number of red zone items by project and category
# TYPE codegraph_red_zone_items_count gauge
codegraph_red_zone_items_count{project="legacy-auth",category="release"} 2

Добавьте эту конечную точку в конфигурацию сбора Prometheus:

scrape_configs:
  - job_name: codegraph-dashboard
    scrape_interval: 5m
    metrics_path: /api/v1/metrics
    static_configs:
      - targets: ["localhost:8000"]

См. также