https://github.com/bitrix-tools/b24-ai-starter-otel
https://github.com/bitrix-tools/b24-ai-starter-otel
Last synced: 3 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/bitrix-tools/b24-ai-starter-otel
- Owner: bitrix-tools
- Created: 2026-02-11T12:26:23.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2026-04-10T06:25:12.000Z (3 months ago)
- Last Synced: 2026-06-19T12:34:32.206Z (5 days ago)
- Language: Shell
- Size: 91.8 KB
- Stars: 1
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# b24-ai-starter-otel
Независимая телеметрическая инфраструктура (OpenTelemetry Backend) для приложений Bitrix24.
**Статус**: 🚧 В разработке
**Версия**: 0.1.0-alpha
**Дата**: 16 февраля 2026
---
## О проекте
Это **отдельный репозиторий инфраструктуры** для сбора, хранения и визуализации телеметрии от приложений на базе [b24-ai-starter-ru](../b24-ai-starter-ru).
### Что внутри
- **OpenTelemetry Collector** — прием событий по протоколу OTLP (HTTP/gRPC)
- **ClickHouse** — колоночная СУБД для хранения событий и метрик
- **Grafana** — визуализация, дашборды, алерты
### Основная идея
```
┌─────────────────────────────────────────┐
│ Ваши приложения (PHP/Python/Node.js) │
│ - b24-ai-starter-ru │
│ - другие приложения │
└─────────────────┬───────────────────────┘
│ OTLP/HTTP
│ (port 4318)
▼
┌─────────────────────────────────────────┐
│ b24-ai-starter-otel (этот репозиторий) │
│ │
│ OTel Collector → ClickHouse → Grafana │
└─────────────────────────────────────────┘
```
**Ключевые преимущества:**
- ✅ Работает независимо от приложений
- ✅ Принимает телеметрию от любых OTLP-совместимых клиентов
- ✅ Один инстанс обслуживает множество приложений
- ✅ Легко масштабируется
---
## Быстрый старт
### Требования
- Docker 20.10+
- Docker Compose v2+
- 2+ GB RAM
- 10+ GB диска
### Запуск
```bash
# Клонировать репозиторий
git clone b24-ai-starter-otel
cd b24-ai-starter-otel
# Настроить переменные окружения
cp .env.example .env
# Отредактируйте .env: установите пароли!
# Запустить инфраструктуру
docker-compose up -d
# Проверить статус
docker-compose ps
```
**Сервисы доступны по адресам:**
- Grafana: http://localhost:3001 (логин: admin, пароль: из .env)
- ClickHouse UI: http://localhost:8123/play
- OTel Collector: http://localhost:4318 (OTLP HTTP endpoint)
### Подключение приложения
В вашем приложении (например, `b24-ai-starter-ru`):
```bash
# .env
TELEMETRY_ENABLED=true
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
OTEL_SERVICE_NAME=my-bitrix24-app
OTEL_ENVIRONMENT=development
```
После перезапуска приложения события начнут поступать в ClickHouse, и их можно будет увидеть в Grafana.
---
## Структура репозитория
```
b24-ai-starter-otel/
├── README.md # Этот файл
├── docker-compose.yml # Определение сервисов
├── .env.example # Шаблон конфигурации
│
├── otel-collector/
│ └── config.yaml # Конфигурация OTel Collector
│ # - receivers (OTLP HTTP/gRPC)
│ # - processors (batch, filter)
│ # - exporters (ClickHouse)
│
├── clickhouse/
│ ├── init.sql # Создание БД и пользователя
│ └── schema/
│ ├── otel_logs.sql # Основная таблица логов
│ ├── logs_analytics_mv.sql # View для продуктовой аналитики
│ └── logs_support_mv.sql # View для техподдержки
│
├── grafana/
│ ├── grafana.ini # Основная конфигурация
│ └── provisioning/
│ ├── datasources/
│ │ └── clickhouse.yaml # Подключение к ClickHouse
│ ├── dashboards/
│ │ ├── dashboards.yaml # Auto-provisioning
│ │ ├── product-analytics.json
│ │ ├── errors-overview.json
│ │ ├── portal-health.json
│ │ ├── api-performance.json
│ │ └── conversion-funnel.json # Воронка активации
│ └── alerting/
│ ├── contact-points.yaml # Email-получатели алертов
│ ├── notification-policies.yaml
│ └── alert-rules.yaml # 5 правил по ошибкам
│
└── docs/
├── DEPLOYMENT.md # Развертывание в production
└── ARCHITECTURE.md # Детали архитектуры
```
---
## Конфигурация
### Переменные окружения (.env)
Основные параметры:
```bash
# OpenTelemetry Collector
OTEL_COLLECTOR_HTTP_PORT=4318
OTEL_COLLECTOR_GRPC_PORT=4317
# ClickHouse
CLICKHOUSE_DB=telemetry
CLICKHOUSE_USER=telemetry_user
CLICKHOUSE_PASSWORD=changeme_secure_password
CLICKHOUSE_HTTP_PORT=8123
CLICKHOUSE_NATIVE_PORT=9000
# Grafana
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=changeme_admin_password
GRAFANA_HTTP_PORT=3001
# Путь к директории logs/ репозитория приложения (b24-ai-starter-full или другого).
# Используется filelog receiver для чтения файловых логов — ошибок, произошедших
# ДО инициализации классов телеметрии (PHP fatals, ошибки DI-контейнера Symfony,
# краши на старте). Такие ошибки не попадают в MonologOTelHandler и доступны
# только через файлы логов.
#
# Может быть относительным (от директории b24-ai-starter-otel) или абсолютным.
# Относительный путь по умолчанию предполагает, что оба репозитория лежат рядом:
# ../b24-ai-starter-otel/ (этот репозиторий)
# ../b24-ai-starter-full/ (репозиторий приложения)
#
# Пример абсолютного пути:
# APP_LOGS_PATH=/home/user/projects/b24-ai-starter-full/logs
APP_LOGS_PATH=../b24-ai-starter-full/logs
```
⚠️ **Важно**: В production обязательно измените пароли по умолчанию!
### Сбор файловых логов (filelog receiver)
OTel Collector следит за файлами логов приложения через `filelog` receiver. Это позволяет перехватывать ошибки, которые происходят до инициализации телеметрии и не попадают в OTLP-поток:
| Файл | Что содержит |
|---|---|
| `logs/php/phpfpm/error.log` | PHP fatals, ошибки PHP-FPM (все окружения) |
| `logs/php/symfony/*.log` | Логи Monolog stream handler (только dev) |
| `logs/node/*.log` | Логи Node.js бэкенда |
| `logs/python/*.log` | Логи Python бэкенда |
Все записи из файлов получают атрибут `log.source=file`, что позволяет в Grafana отличать их от логов, пришедших через OTLP (`log.source=otlp`).
Позиции чтения сохраняются в Docker volume `otel-filepos` — при рестарте коллектора файлы не перечитываются заново.
### Volumes (данные)
Docker volumes для персистентности:
- `clickhouse_data` — данные ClickHouse
- `grafana_data` — конфигурация и дашборды Grafana
```bash
# Посмотреть volumes
docker volume ls | grep b24
# Бэкап ClickHouse
docker-compose exec clickhouse clickhouse-client --query="BACKUP DATABASE telemetry TO Disk('backups', 'backup-$(date +%Y%m%d).zip')"
```
---
## Дашборды Grafana
После запуска автоматически создаются 4 дашборда:
### 1. Product Analytics
Продуктовая аналитика для Product Managers:
- Activation rate (% пользователей, завершивших онбординг)
- Retention cohorts
- Core actions (ключевые действия пользователей)
- Feature adoption
- Funnel analysis (воронки конверсии)
### 2. Errors Overview
Мониторинг ошибок для DevOps/Support:
- Количество ошибок по типам
- Top 10 ошибок
- Affected portals (какие порталы затронуты)
- Error rate trends
- Stack traces (топ фреймов)
### 3. Portal Health
Здоровье конкретных порталов:
- API latency (p50, p95, p99)
- Success rate процессов
- Resource usage
- Active users
- Фильтр по portal_id
### 4. API Performance
Производительность API вызовов:
- Request rate (rps)
- Response time distribution
- Error rate
- Top slow endpoints
- Bitrix24 API calls (успешные/неудачные)
### 5. Conversion Funnel (Воронка активации)
Продуктовая воронка конверсии — сколько пользователей прошли каждый шаг онбординга:
| Шаг | Событие |
|---|---|
| 1 | `app_installed` — установка приложения |
| 2 | `app_install_finalized` — завершение установки |
| 3 | `event_subscription_registered` — подписка на события |
| 4 | `app_opened` — первое открытие |
| 5 | `ui_button_click` — первое целевое действие |
Дашборд показывает уникальных пользователей (`portal.member_id`) на каждом шаге за выбранный период.
Поддерживает фильтрацию по домену портала (`$domain`).
---
## Алерты
Grafana автоматически загружает правила из `grafana/provisioning/alerting/`. Правила оцениваются каждую минуту по скользящему окну 5 минут.
### Настроенные правила
| Правило | Условие | Severity |
|---|---|---|
| FATAL ошибки | любое появление FATAL | critical |
| Всплеск backend ошибок | > 10 ERROR/FATAL за 5 мин | warning |
| Всплеск frontend JS ошибок | > 20 событий `ui_error` за 5 мин | warning |
| Ошибки на нескольких порталах | > 3 уникальных портала с ошибками за 5 мин | critical |
| Общий всплеск ошибок | > 50 ошибок (backend + frontend) за 5 мин | critical |
Посмотреть состояние правил: **Grafana → Alerting → Alert rules** (папка `Telemetry Alerts`).
### Настройка email-уведомлений
По умолчанию SMTP отключён. Для получения алертов на почту:
**1. Настроить SMTP в `.env`** — раскомментировать и заполнить блок:
```bash
GF_SMTP_ENABLED=true
GF_SMTP_HOST=smtp.gmail.com:587 # для Gmail
GF_SMTP_USER=your@gmail.com
GF_SMTP_PASSWORD=your_app_password # App Password, не основной пароль
GF_SMTP_FROM_ADDRESS=your@gmail.com
GF_SMTP_FROM_NAME=Grafana Alerts
```
> Для Gmail: включить двухфакторную аутентификацию → [создать App Password](https://myaccount.google.com/apppasswords) → использовать его как `GF_SMTP_PASSWORD`.
**2. Указать email-получателя** в файле `grafana/provisioning/alerting/contact-points.yaml`:
```yaml
settings:
addresses: "your@email.com" # ← изменить на реальный адрес
```
Несколько адресов разделяются точкой с запятой: `user1@example.com;user2@example.com`
**3. Перезапустить Grafana:**
```bash
sudo rm -f data/grafana/grafana.db
make up
```
> Удаление `grafana.db` необходимо — иначе Grafana использует закешированную конфигурацию provisioning.
---
## Интеграция с приложениями
### PHP (b24-ai-starter-ru)
См. документацию в репозитории [b24-ai-starter-ru](../b24-ai-starter-ru).
Краткий пример:
```php
// composer.json
"require": {
"open-telemetry/sdk": "^1.0",
"open-telemetry/exporter-otlp": "^1.0"
}
```
```php
// отправка события
$telemetry->trackEvent('user.activation.completed', [
'portal_id' => $portalId,
'user_id' => $userId,
'step' => 'final'
]);
```
### Python
```bash
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp
```
```python
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
# Инициализация
provider = TracerProvider()
trace.set_tracer_provider(provider)
otlp_exporter = OTLPSpanExporter(endpoint="http://localhost:4318/v1/traces")
provider.add_span_processor(BatchSpanProcessor(otlp_exporter))
# Использование
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("process-data"):
# ваш код
pass
```
### Node.js
```bash
npm install @opentelemetry/sdk-node @opentelemetry/exporter-trace-otlp-http
```
```javascript
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({
url: 'http://localhost:4318/v1/traces',
}),
serviceName: 'my-node-app',
});
sdk.start();
```
---
## Управление
### Основные команды
```bash
# Запуск
docker-compose up -d
# Статус сервисов
docker-compose ps
# Логи
docker-compose logs -f # все сервисы
docker-compose logs -f otel-collector # только collector
docker-compose logs -f clickhouse # только clickhouse
docker-compose logs -f grafana # только grafana
# Остановка
docker-compose stop
# Перезапуск
docker-compose restart
# Полное удаление (с данными!)
docker-compose down -v
```
### Проверка работоспособности
```bash
# OTel Collector (должен ответить)
curl http://localhost:4318/v1/logs -X POST
# ClickHouse (проверка подключения)
docker-compose exec clickhouse clickhouse-client --query="SELECT 1"
# Проверка таблиц
docker-compose exec clickhouse clickhouse-client --query="SHOW TABLES FROM telemetry"
# Количество событий
docker-compose exec clickhouse clickhouse-client --query="SELECT count() FROM telemetry.otel_logs"
```
### Troubleshooting
**Проблема**: События не поступают в ClickHouse
```bash
# 1. Проверить логи OTel Collector
docker-compose logs otel-collector | grep ERROR
# 2. Проверить, что endpoint доступен
curl -v http://localhost:4318/v1/logs
# 3. Проверить конфигурацию приложения
# OTEL_EXPORTER_OTLP_ENDPOINT должен указывать на collector
```
**Проблема**: Grafana не показывает данные
```bash
# 1. Проверить подключение к ClickHouse
docker-compose exec grafana curl http://clickhouse:8123/
# 2. Проверить, что данные есть
docker-compose exec clickhouse clickhouse-client \
--query="SELECT count() FROM telemetry.otel_logs WHERE timestamp > now() - INTERVAL 1 HOUR"
# 3. Проверить datasource в Grafana (Configuration → Data sources)
```
---
## Production Deployment
Для production рекомендуется:
1. **Разделить компоненты**
- ClickHouse на отдельном сервере (или кластер)
- OTel Collector за load balancer (несколько инстансов)
- Grafana Cloud или управляемый Grafana
2. **Безопасность**
- TLS для OTLP endpoint
- Аутентификация для Grafana
- Network policies / firewall
- Регулярные обновления образов
3. **Масштабирование**
- ClickHouse sharding для больших нагрузок
- Replication для высокой доступности
- Мониторинг самой инфраструктуры
Подробнее: [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md)
---
## Связанные репозитории
- [b24-ai-starter-ru](../b24-ai-starter-ru) — PHP приложение с клиентом телеметрии
- [OpenTelemetry Documentation](../README.md) — общая документация по телеметрии
- [ARCHITECTURE_SPLIT.md](../ARCHITECTURE_SPLIT.md) — детали архитектуры разделения
---
## Roadmap
- [x] Базовая архитектура (февраль 2026)
- [ ] docker-compose.yml (в процессе)
- [ ] Конфигурация OTel Collector
- [ ] Схемы ClickHouse (otel_logs, MVs)
- [ ] 4 дашборда Grafana
- [ ] Production deployment guide
- [ ] Kubernetes Helm chart
- [ ] Мониторинг самой инфраструктуры
- [ ] Automated backups
---
## Лицензия
MIT License
---
## Поддержка
- 📖 [Документация](docs/)
- 🐛 [Issues](../../issues)
- 💬 Создайте issue для вопросов
**Дата последнего обновления**: 16 февраля 2026