{"id":20152145,"url":"https://github.com/mfurquimdev/prometheus-alerts","last_synced_at":"2026-06-08T08:02:22.481Z","repository":{"id":151961142,"uuid":"175883093","full_name":"mfurquimdev/prometheus-alerts","owner":"mfurquimdev","description":null,"archived":false,"fork":false,"pushed_at":"2019-03-19T18:40:58.000Z","size":484,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-03T01:18:23.923Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","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/mfurquimdev.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":"2019-03-15T19:57:40.000Z","updated_at":"2022-02-18T11:29:09.000Z","dependencies_parsed_at":"2023-06-02T05:30:43.179Z","dependency_job_id":null,"html_url":"https://github.com/mfurquimdev/prometheus-alerts","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mfurquimdev/prometheus-alerts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfurquimdev%2Fprometheus-alerts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfurquimdev%2Fprometheus-alerts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfurquimdev%2Fprometheus-alerts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfurquimdev%2Fprometheus-alerts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mfurquimdev","download_url":"https://codeload.github.com/mfurquimdev/prometheus-alerts/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfurquimdev%2Fprometheus-alerts/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34053435,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2024-11-13T23:08:57.648Z","updated_at":"2026-06-08T08:02:22.404Z","avatar_url":"https://github.com/mfurquimdev.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Alertas do Prometheus\n\nAlerta de aumento anormal no número de requisições por segundo, utilizando o prometheus com visualização no grafana.\n\n![Alerta de aumento anormal nas requisições](./img/Alerta_de_aumento_anormal_nas_requisicoes.png \"Alerta de aumento anormal nas requisições\")\n\nNo gráfico acima, a linha em verde representa a taxa de requisições por segundo (suavizada fazendo a média em um minuto). A linha em amarelo é a predição de qual a taxa de requisição em dez minuto, com base em quinze minutos de histórico. A linha em azul é a média dos picos da taxa de requisições. Por fim, a área vermelha representa os períodos em que a predição é maior que a média dos máximo. Caso isso continue a acontecer por dez minutos, um alerta será lançado\n\n## Aumento no número de requisições por segundo\n\nA simulação do aumento de requisições por segundo foi feita com um script em bash alterando o gerador de métricas. Mas antes disso, foi enviado uma requisição para zerar o número de requisições de erro (5xx). Isto garante que o número de requisições 2xx por segundo gerado é o mais próximo de 100% o possível. Ainda há algumas requisições 5xx, algo em torno de 60 requisições 5xx para cada 6000 2xx (1%).\n\n```bash\ncurl --header \"Content-Type: application/json\" --request POST --data '{\"resourcename\": \"/resource/test-0001\", \"type\": \"errorrate\", \"value\": 0.0}' http://localhost:3000/accidents\n```\n\nCom a garantia de que 99% das requisições geradas pelo gerador são 2xx, foi escrito o script para aumentar gradualmente o número de requisições. Para isso, o script envia uma requisição POST a cada cinco minutos para o gerador usando o curl. Os dois loops aumentam as requisições de acordo com a seguinte série: 100, 200, 300, ..., 800, 900, 1000, 2000, 3000, ..., 8000, e 9000. Após 1.5h, o prometheus terá capturado as métrias e as _queries_ podem ser executadas em cima dos dados gerados.\n\n```bash\nfor (( i = 100; i \u003c 10000; i = i * 10 )); do\n\tfor (( j = 1; j \u003c 10; j++ )); do\n\t\techo \"$(( i * j ))\";\n\t\tcurl --header \"Content-Type: application/json\" --request POST --data \\\n      \"{\\\"resourcename\\\": \\\"/resource/test-0001\\\",\\\"type\\\": \\\"calls\\\",\\\"value\\\": $(( i * j ))}\" \\\n      http://localhost:3000/accidents;\n\t\tsleep 300;\n\tdone;\ndone;\n```\n\n## Regras de armazenamento e de alerta\n\nO teste foi realizado na versão 2.7 do prometheus por conta da facilidade com sub-queries, mas posteriormente foi traduzido para a versão 2.4 utilizando as _recording rules_.\n\nA primeira regra é agregar, por `uri` e `status`, a taxa de requisições. Foi filtrado a `uri=/resource/test-0001` e `status=\"2xx\"` para capturar apenas o grupo de requisições do gerador de acordo com o script acima.\n\n```yml\n# Rate of requests per second\n- record: http_requests_seconds_summary_count:sum_irate1m\n  expr:\n    sum(\n      irate(http_requests_seconds_summary_count{uri=\"/resource/test-0001\", status=\"2xx\"}[1m])\n    ) by (uri, status)\n```\n\nO comportamento dessa expressão é relativamente caótico, com vários vales e picos. Para suavizar os dados, foi feito uma regra de média ao longo de um minuto. Todas as regras são baseadas nesta média.\n\n```yml\n# Average over time (1m) to make data smoother\n- record: http_requests_seconds_summary_count:avg1m_sum_irate1m\n  expr: avg_over_time( http_requests_seconds_summary_count:sum_irate1m[1m] )\n```\n\nPara predizer o número de requisições em um determinado tempo no futuro, foi utilizado a função `predict_linear`, que utiliza regressão linear internamente. Está sendo observado os últimos 15 minutos para predizer a taxa de requisições em 10 minutos a frente.\n\n```yml\n# Predict rate of requests in 10m based on smoothed data\n- record: http_requests_seconds_summary_count:predict15m_avg1m_sum_irate1m\n  expr: predict_linear( http_requests_seconds_summary_count:avg1m_sum_irate1m[15m], 600 ) \u003e 0\n```\n\nPara realizar o alerta de crescimento anormal do número de requisições por segundo é preciso ter um limiar, adaptável de acordo com o histórico já observado. Um bom limiar é a média dos picos em um determinado tempo. Os picos são calculados com a função `max_over_time`, e está sendo observado até uma hora de dados. Para suavizar os dados, foi utilizado a média destes picos ao longo de três horas.\n\n```yml\n# Record max rate of requests over 1h based on smoothed data\n- record: http_requests_seconds_summary_count:max1h_avg1m_sum_irate1m\n  expr: max_over_time( http_requests_seconds_summary_count:avg1m_sum_irate1m[1h] )\n\n# Average over time (3h) of peaks (max) rate of requests to use on alert\n- record: http_requests_seconds_summary_count:avg3h_max1h_avg1m_sum_irate1m\n  expr: avg_over_time( http_requests_seconds_summary_count:max1h_avg1m_sum_irate1m[3h] )\n```\n\nO alerta é disparado caso a predição supere, durante dez minutos, a média dos picos observados anteriormente.\n\n```yml\n  # If rate of requests per second is greater than the average of peaks\n  - alert: http_requests_seconds_summary_count_abnormal_increase\n    expr:\n      http_requests_seconds_summary_count:predict15m_avg1m_sum_irate1m\n      \u003e\n      http_requests_seconds_summary_count:avg3h_max1h_avg1m_sum_irate1m\n    for: 10m\n    annotations:\n      description: Taxa de crescimento anormal da taxa de requisições por segundo, indicando quebra de recorde histórico. Versão do Centralizador '{{ $labels.component_version }}', Status '{{ $labels.status }}', Versão App '{{ $labels.device_app_version }}'.\n      summary: Caso a predição sobre a média da taxa de requisições http do aplicativo supere a média dos picos durante dez minutos, um alerta será lançado.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmfurquimdev%2Fprometheus-alerts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmfurquimdev%2Fprometheus-alerts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmfurquimdev%2Fprometheus-alerts/lists"}