{"id":21097157,"url":"https://github.com/alenales/reporing","last_synced_at":"2026-05-17T12:42:18.171Z","repository":{"id":64685362,"uuid":"577465380","full_name":"AlenaLes/Reporing","owner":"AlenaLes","description":"Отправка ежедневной отчетности в Telegram и настройка алертов.","archived":false,"fork":false,"pushed_at":"2024-03-04T20:40:59.000Z","size":26,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-01T10:42:11.818Z","etag":null,"topics":["alert","python","sql","telegram-bot"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlenaLes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-12T19:55:53.000Z","updated_at":"2024-09-30T20:43:44.000Z","dependencies_parsed_at":"2024-03-04T22:02:24.720Z","dependency_job_id":null,"html_url":"https://github.com/AlenaLes/Reporing","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AlenaLes/Reporing","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlenaLes%2FReporing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlenaLes%2FReporing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlenaLes%2FReporing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlenaLes%2FReporing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlenaLes","download_url":"https://codeload.github.com/AlenaLes/Reporing/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlenaLes%2FReporing/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33139146,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T09:28:26.183Z","status":"ssl_error","status_checked_at":"2026-05-17T09:27:52.702Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alert","python","sql","telegram-bot"],"created_at":"2024-11-19T22:46:41.606Z","updated_at":"2026-05-17T12:42:18.153Z","avatar_url":"https://github.com/AlenaLes.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Настройка отправки отчетности и алертов в  telegram\n\n## Краткое описание\n\nПроект направлен на ежедневную отправку основных метрик в telegram в установленное время. Данные взяты из приложения, объединяющее ленту новостей и сообщений. Также в чат telegram направляются алерты с информацией по отклонениям метрик от нормы. \n\nСтэк:\n\n- JupiterHub\n- Clickhouse\n- Airflow\n- Superset\n- Python\n\n## Ежедневная отчетность по ленте новостей\n\nПодключаемся к базе данных и сразу зададим все условия для отправки итоговых отчетов в нужный чат. Отчеты за полный вчерашний день будут приходить каждый день в 11:00 по МСК.\n\n```\n#подключаемся к базе данных\nconnection = {\n    'host': 'https://clickhouse.lab.karpov.courses',\n                      'database':'simulator_20221020',\n                      'user':'student', \n                      'password':'dpo_python_2020'\n                     }\n# Зададим параметры\ndefault_args = {\n    'owner': 'a-lesihina', # Владелец операции \n    'depends_on_past': False, # Зависимость от прошлых запусков\n    'retries': 1, # Кол-во попыток выполнить DAG\n    'retry_delay': timedelta(minutes=1), # Промежуток между перезапусками\n    'start_date': datetime(2022, 11, 15) # Дата начала выполнения DAG\n                }\n```\n\nВ файле Feed_report и Full_report можно посмотреть настройку графиков и способ подсчета метрик.\n\nВ результате ежедневно получаем следующий отчет:\n![image](https://user-images.githubusercontent.com/100629361/207144872-ff32a48a-23a5-4349-bd34-1ad715e436ff.png)\n\n## Ежедневная отчетность по ленте новостей и сообщениям\nДанные для таблцы получаем тем же образом, что и на предыдущей отчетности.\n\nВ данной отчетности отражается информация:\n\n- значения ключевых метрик за предыдущий день\n- график с значениями метрик за предыдущие 7 дней\n- отражены метрики: DAU, Просмотры, Лайки, CTR\n\nВ результате получаем следующую отчетность:\n\n![image](https://user-images.githubusercontent.com/100629361/207147146-f7b039cf-d7fa-4047-a0e9-8d0e5f2dd667.png)\n\n![image](https://user-images.githubusercontent.com/100629361/207147232-86a37f3e-e6a7-40ba-8922-cd38d62d29e4.png)\n![image](https://user-images.githubusercontent.com/100629361/207147256-2ca8e85b-401d-4eed-b5cb-f35eefc51a7f.png)\n\n## Настройка алертов\n\nСистема с периодичностью в 15 минут проверяет ключевые метрики, такие,как: активные пользователи в ленте / мессенджере, просмотры, лайки, CTR, количество отправленных сообщений. \n\nВ случае обнаружения аномального значения, в чат направляется алерт и график.\n\nИспользуем квартили для определения верхних и нижних допустимых значений.\n\n```\ndef check_anomalys(df, metric,a=3, n=6):\n    df['25'] = df[metric].shift(1).rolling(n).quantile(0.25)\n    df['75'] = df[metric].shift(1).rolling(n).quantile(0.75)\n    df['iqr'] = df['75'] - df['25']\n    df['up'] = df['75'] + a*df['iqr']\n    df['low'] = df['25'] - a*df['iqr']\n\n    df['up'] = df['up'].rolling(n, center=True, min_periods=1).mean()\n    df['low'] = df['low'].rolling(n, center=True, min_periods=1).mean()\n\n    if df[metric].iloc[-1] \u003c df['low'].iloc[-1] or df[metric].iloc[-1] \u003e df['up'].iloc[-1]:\n        is_alert = 1\n    else:\n        is_alert = 0\n    return is_alert, df\n```\n\nПосле, с помощью SQL, объединяем данные в одну таблицу для создания единого таска и настраиваем внешний вид сообщения и графиков. Итоговое сообщение выглядит следующим образом:\n\n![image](https://user-images.githubusercontent.com/100629361/207148813-e684c6c8-45dd-4538-9867-abcc1cd8e631.png)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falenales%2Freporing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falenales%2Freporing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falenales%2Freporing/lists"}