В этом руководстве рассматриваются вопросы мониторинга, сбора метрик и проверки работоспособности CodeGraph в производственных средах.
Содержание¶
- Обзор
- Быстрый старт
- Включение метрик
- Приложение проверки работоспособности
- Метрики Prometheus
- Доступные метрики
- Интервалы гистограмм
- Запись метрик
- Функции записи
- Декораторы
- @monitor_scenario
- @monitor_agent
- @monitor_cache
- MetricsCollector
- MetricsSummary
- Проверки работоспособности
- Статус работоспособности
- Работоспособность компонентов
- Пользовательские проверки
- Конечные точки — Standalone-приложение
- Конечные точки — API Router
- Автономные функции
- Структурированное логирование
- StructuredLogger
- Формат логов
- Замер операций
- MetricsMiddleware
- Панели Grafana
- Рекомендуемые панели
- Правила оповещений
- Alertmanager
- Yandex Cloud Dashboard
- Интеграция с Kubernetes
- Конфигурация развертывания
- ServiceMonitor для Prometheus
- Рекомендации
- Grafana-дашборд CISO/CTO
- Правила оповещений дашборда
- Метрики дашборда V2
- См. также
Обзор¶
Модуль мониторинга (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
Рекомендации¶
- Используйте декораторы (
monitor_scenario,monitor_agent,monitor_cache) для автоматической инструментации - Используйте
StructuredLogger.timed_operation()для замера и логирования длительности операций - Используйте функции записи (
record_llm_call,record_cpg_query,record_retrieval) вместо прямого увеличения счётчиков - Отслеживайте использование токенов через
LLM_TOKENSдля контроля расходов - Анализируйте задержки P95/P99, а не только средние значения
- Настраивайте пороги оповещений в соответствии с SLO (текущие: частота ошибок >25%, задержка p95 >30 с)
- Используйте
MetricsCollectorдля агрегации метрик в памяти, когда Prometheus не развёрнут
Grafana-дашборд CISO/CTO¶
Дашборд CISO/CTO обеспечивает обзор состояния безопасности и качества кода всех зарегистрированных проектов на уровне руководства. Поставляется в виде готовой JSON-модели Grafana: grafana/dashboard_ciso.json.
Импорт¶
- Откройте Grafana и перейдите в Dashboards > Import.
- Загрузите
grafana/dashboard_ciso.jsonили вставьте его содержимое. - Выберите источник данных Prometheus, настроенный для метрик CodeGraph.
- Нажмите 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"]
См. также¶
- Справочник по REST API — конечные точки API, включая проверку работоспособности и метрики
- Справочник по MCP-инструментам — MCP-инструменты дашборда V2
- Документация Prometheus
- Документация Grafana