robusta-api 0.50.0__tar.gz → 0.51.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. {robusta_api-0.50.0 → robusta_api-0.51.0}/PKG-INFO +2 -2
  2. {robusta_api-0.50.0 → robusta_api-0.51.0}/pyproject.toml +5 -4
  3. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/_version.py +1 -1
  4. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/api/__init__.py +1 -0
  5. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/prometheus_enrichment_utils.py +33 -120
  6. robusta_api-0.51.0/src/robusta/core/reporting/charts.py +493 -0
  7. robusta_api-0.51.0/src/robusta/core/reporting/custom_rendering.py +22 -0
  8. robusta_api-0.50.0/src/robusta/core/reporting/custom_rendering.py +0 -85
  9. {robusta_api-0.50.0 → robusta_api-0.51.0}/LICENSE +0 -0
  10. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/__init__.py +0 -0
  11. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/clients/robusta_client.py +0 -0
  12. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/__init__.py +0 -0
  13. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/__init__.py +0 -0
  14. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/discovery.py +0 -0
  15. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/resource_names.py +0 -0
  16. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/top_service_resolver.py +0 -0
  17. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/utils.py +0 -0
  18. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/exceptions.py +0 -0
  19. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/__init__.py +0 -0
  20. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/base_params.py +0 -0
  21. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/cluster_status.py +0 -0
  22. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/env_vars.py +0 -0
  23. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/events.py +0 -0
  24. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/helm_release.py +0 -0
  25. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/jobs.py +0 -0
  26. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/k8s_operation_type.py +0 -0
  27. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/namespaces.py +0 -0
  28. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/nodes.py +0 -0
  29. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/openshift_group.py +0 -0
  30. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/pods.py +0 -0
  31. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/runner_config.py +0 -0
  32. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/services.py +0 -0
  33. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/persistency/__init__.py +0 -0
  34. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/persistency/in_memory.py +0 -0
  35. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/persistency/scheduled_jobs_states_dal.py +0 -0
  36. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/__init__.py +0 -0
  37. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/actions_registry.py +0 -0
  38. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/base_trigger.py +0 -0
  39. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/common.py +0 -0
  40. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/container_playbook_utils.py +0 -0
  41. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/crash_reporter.py +0 -0
  42. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/generation.py +0 -0
  43. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/CRD_API_DOCUMENTATION.md +0 -0
  44. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/__init__.py +0 -0
  45. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/ai_integration.py +0 -0
  46. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/crds.py +0 -0
  47. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/discovery_events.py +0 -0
  48. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/job_utils.py +0 -0
  49. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/node_enrichment_utils.py +0 -0
  50. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/node_playbook_utils.py +0 -0
  51. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/oom_killer_utils.py +0 -0
  52. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/playbook_utils.py +0 -0
  53. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/playbooks_event_handler.py +0 -0
  54. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/playbooks_event_handler_impl.py +0 -0
  55. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/pod_utils/crashloop_utils.py +0 -0
  56. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/pod_utils/imagepull_utils.py +0 -0
  57. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/pod_utils/pending_pod_utils.py +0 -0
  58. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/trigger.py +0 -0
  59. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/pubsub/__init__.py +0 -0
  60. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/pubsub/event_emitter.py +0 -0
  61. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/pubsub/event_subscriber.py +0 -0
  62. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/pubsub/events_pubsub.py +0 -0
  63. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/__init__.py +0 -0
  64. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/action_requests.py +0 -0
  65. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/base.py +0 -0
  66. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/blocks.py +0 -0
  67. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/callbacks.py +0 -0
  68. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/consts.py +0 -0
  69. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/finding_subjects.py +0 -0
  70. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/holmes.py +0 -0
  71. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/url_helpers.py +0 -0
  72. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/utils.py +0 -0
  73. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/schedule/__init__.py +0 -0
  74. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/schedule/model.py +0 -0
  75. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/schedule/scheduler.py +0 -0
  76. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/__init__.py +0 -0
  77. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/common/__init__.py +0 -0
  78. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/common/channel_transformer.py +0 -0
  79. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/common/html_tools.py +0 -0
  80. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/datadog/__init__.py +0 -0
  81. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/datadog/datadog_sink.py +0 -0
  82. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/datadog/datadog_sink_params.py +0 -0
  83. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/discord/__init__.py +0 -0
  84. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/discord/discord_sink.py +0 -0
  85. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/discord/discord_sink_params.py +0 -0
  86. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/file/__init__.py +0 -0
  87. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/file/file_sink.py +0 -0
  88. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/file/file_sink_params.py +0 -0
  89. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/file/object_traverser.py +0 -0
  90. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/google_chat/__init__.py +0 -0
  91. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/google_chat/google_chat.py +0 -0
  92. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/google_chat/google_chat_params.py +0 -0
  93. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/__init__.py +0 -0
  94. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/incidentio_api.py +0 -0
  95. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/incidentio_client.py +0 -0
  96. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/incidentio_sink.py +0 -0
  97. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/incidentio_sink_params.py +0 -0
  98. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/jira/__init__.py +0 -0
  99. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/jira/jira_sink.py +0 -0
  100. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/jira/jira_sink_params.py +0 -0
  101. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/kafka/__init__.py +0 -0
  102. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/kafka/kafka_sink.py +0 -0
  103. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/kafka/kafka_sink_params.py +0 -0
  104. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mail/__init__.py +0 -0
  105. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mail/mail_sink.py +0 -0
  106. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mail/mail_sink_params.py +0 -0
  107. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mattermost/__init__.py +0 -0
  108. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mattermost/mattermost_sink.py +0 -0
  109. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mattermost/mattermost_sink_params.py +0 -0
  110. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/msteams/__init__.py +0 -0
  111. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/msteams/msteams_sink.py +0 -0
  112. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/msteams/msteams_sink_params.py +0 -0
  113. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/msteams/msteams_webhook_tranformer.py +0 -0
  114. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/opsgenie/__init__.py +0 -0
  115. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/opsgenie/opsgenie_sink.py +0 -0
  116. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/opsgenie/opsgenie_sink_params.py +0 -0
  117. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pagerduty/__init__.py +0 -0
  118. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pagerduty/pagerduty_sink.py +0 -0
  119. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pagerduty/pagerduty_sink_params.py +0 -0
  120. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pushover/__init__.py +0 -0
  121. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pushover/pushover_client.py +0 -0
  122. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pushover/pushover_sink.py +0 -0
  123. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pushover/pushover_sink_params.py +0 -0
  124. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/__init__.py +0 -0
  125. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/dal/__init__.py +0 -0
  126. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/dal/model_conversion.py +0 -0
  127. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/dal/supabase_dal.py +0 -0
  128. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/discovery_metrics.py +0 -0
  129. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/prometheus_discovery_utils.py +0 -0
  130. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/robusta_sink.py +0 -0
  131. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/robusta_sink_params.py +0 -0
  132. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/__init__.py +0 -0
  133. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/account_resource_fetcher.py +0 -0
  134. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/base_resource_manager.py +0 -0
  135. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/prometheus_alert_resource_manager.py +0 -0
  136. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/rrm.py +0 -0
  137. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/types.py +0 -0
  138. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/rocketchat/__init__.py +0 -0
  139. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/rocketchat/rocketchat_sink.py +0 -0
  140. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/rocketchat/rocketchat_sink_params.py +0 -0
  141. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/servicenow/__init__.py +0 -0
  142. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/servicenow/servicenow_sink.py +0 -0
  143. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/servicenow/servicenow_sink_params.py +0 -0
  144. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/sink_base.py +0 -0
  145. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/sink_base_params.py +0 -0
  146. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/sink_config.py +0 -0
  147. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/sink_factory.py +0 -0
  148. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/__init__.py +0 -0
  149. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/preview/slack_sink_preview.py +0 -0
  150. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/preview/slack_sink_preview_params.py +0 -0
  151. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/slack_sink.py +0 -0
  152. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/slack_sink_params.py +0 -0
  153. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/templates/header.j2 +0 -0
  154. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/templates/template_loader.py +0 -0
  155. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/telegram/__init__.py +0 -0
  156. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/telegram/telegram_client.py +0 -0
  157. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/telegram/telegram_sink.py +0 -0
  158. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/telegram/telegram_sink_params.py +0 -0
  159. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/timing.py +0 -0
  160. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/transformer.py +0 -0
  161. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/victorops/__init__.py +0 -0
  162. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/victorops/victorops_sink.py +0 -0
  163. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/victorops/victorops_sink_params.py +0 -0
  164. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webex/__init__.py +0 -0
  165. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webex/webex_sink.py +0 -0
  166. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webex/webex_sink_params.py +0 -0
  167. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webhook/__init__.py +0 -0
  168. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webhook/webhook_sink.py +0 -0
  169. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webhook/webhook_sink_params.py +0 -0
  170. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/yamessenger/__init__.py +0 -0
  171. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/yamessenger/yamessenger_client.py +0 -0
  172. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/yamessenger/yamessenger_sink.py +0 -0
  173. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/yamessenger/yamessenger_sink_params.py +0 -0
  174. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/zulip/__init__.py +0 -0
  175. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/zulip/zulip_sink.py +0 -0
  176. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/zulip/zulip_sink_params.py +0 -0
  177. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/stream/utils.py +0 -0
  178. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/container_oom_killed_trigger.py +0 -0
  179. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/custom_triggers.py +0 -0
  180. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/error_event_trigger.py +0 -0
  181. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/helm_releases_triggers.py +0 -0
  182. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/job_failed_trigger.py +0 -0
  183. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/multi_resources_trigger.py +0 -0
  184. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/oom_killed_trigger_base.py +0 -0
  185. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/pod_crash_loop_trigger.py +0 -0
  186. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/pod_evicted_trigger.py +0 -0
  187. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/pod_image_pull_backoff.py +0 -0
  188. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/pod_oom_killed_trigger.py +0 -0
  189. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/__init__.py +0 -0
  190. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/argocd/argocd_client.py +0 -0
  191. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/common/__init__.py +0 -0
  192. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/common/requests.py +0 -0
  193. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/discord/__init__.py +0 -0
  194. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/discord/sender.py +0 -0
  195. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/git/__init__.py +0 -0
  196. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/git/git_repo.py +0 -0
  197. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/git/well_known_hosts.py +0 -0
  198. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/google_chat/__init__.py +0 -0
  199. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/google_chat/sender.py +0 -0
  200. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/grafana.py +0 -0
  201. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/helper.py +0 -0
  202. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/jira/__init__.py +0 -0
  203. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/jira/client.py +0 -0
  204. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/jira/sender.py +0 -0
  205. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/__init__.py +0 -0
  206. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/api_client_utils.py +0 -0
  207. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/__init__.py +0 -0
  208. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/events.py +0 -0
  209. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/models.py +0 -0
  210. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/triggers.py +0 -0
  211. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/v1/__init__.py +0 -0
  212. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/v1/models.py +0 -0
  213. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/base_event.py +0 -0
  214. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/base_triggers.py +0 -0
  215. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/custom_crds.py +0 -0
  216. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/custom_models.py +0 -0
  217. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/model_not_found_exception.py +0 -0
  218. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/process_utils.py +0 -0
  219. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/templates.py +0 -0
  220. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mail/__init__.py +0 -0
  221. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mail/sender.py +0 -0
  222. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mattermost/__init__.py +0 -0
  223. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mattermost/client.py +0 -0
  224. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mattermost/sender.py +0 -0
  225. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/__init__.py +0 -0
  226. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_adaptive_card_files.py +0 -0
  227. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_image.py +0 -0
  228. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_text.py +0 -0
  229. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/__init__.py +0 -0
  230. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_action.py +0 -0
  231. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_base.py +0 -0
  232. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_card.py +0 -0
  233. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_column.py +0 -0
  234. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_container.py +0 -0
  235. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_images.py +0 -0
  236. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_table.py +0 -0
  237. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_text_block.py +0 -0
  238. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_mark_down_fix_url.py +0 -0
  239. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_msg.py +0 -0
  240. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/sender.py +0 -0
  241. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/openshift/__init__.py +0 -0
  242. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/openshift/token.py +0 -0
  243. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/prometheus/__init__.py +0 -0
  244. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/prometheus/models.py +0 -0
  245. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/prometheus/trigger.py +0 -0
  246. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/prometheus/utils.py +0 -0
  247. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/receiver.py +0 -0
  248. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/__init__.py +0 -0
  249. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/cpu_analyzer.py +0 -0
  250. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/memory_analyzer.py +0 -0
  251. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/node_cpu_analyzer.py +0 -0
  252. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/prometheus_analyzer.py +0 -0
  253. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/rocketchat/__init__.py +0 -0
  254. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/rocketchat/sender.py +0 -0
  255. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/__init__.py +0 -0
  256. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/event.py +0 -0
  257. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/models.py +0 -0
  258. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/playbook_scheduler.py +0 -0
  259. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/playbook_scheduler_manager.py +0 -0
  260. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/playbook_scheduler_manager_impl.py +0 -0
  261. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/trigger.py +0 -0
  262. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/servicenow/__init__.py +0 -0
  263. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/servicenow/sender.py +0 -0
  264. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/slack/__init__.py +0 -0
  265. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/slack/sender.py +0 -0
  266. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/webex/__init__.py +0 -0
  267. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/webex/sender.py +0 -0
  268. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/zulip/__init__.py +0 -0
  269. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/zulip/sender.py +0 -0
  270. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/model/alert_relabel_config.py +0 -0
  271. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/model/config.py +0 -0
  272. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/model/playbook_action.py +0 -0
  273. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/model/playbook_definition.py +0 -0
  274. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/patch/patch.py +0 -0
  275. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/__init__.py +0 -0
  276. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/config_loader.py +0 -0
  277. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/log_init.py +0 -0
  278. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/main.py +0 -0
  279. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/not_found_exception.py +0 -0
  280. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/object_updater.py +0 -0
  281. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/process_setup.py +0 -0
  282. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/ssl_utils.py +0 -0
  283. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/telemetry.py +0 -0
  284. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/telemetry_service.py +0 -0
  285. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/web.py +0 -0
  286. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/web_api.py +0 -0
  287. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/__init__.py +0 -0
  288. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/archive.py +0 -0
  289. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/auth_provider.py +0 -0
  290. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/base64_utils.py +0 -0
  291. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/cluster_provider_discovery.py +0 -0
  292. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/common.py +0 -0
  293. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/decorators.py +0 -0
  294. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/docs.py +0 -0
  295. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/documented_pydantic.py +0 -0
  296. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/error_codes.py +0 -0
  297. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/file_system_watcher.py +0 -0
  298. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/function_hashes.py +0 -0
  299. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/json_schema.py +0 -0
  300. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/parsing.py +0 -0
  301. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/rate_limiter.py +0 -0
  302. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/scope.py +0 -0
  303. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/server_start.py +0 -0
  304. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/service_discovery.py +0 -0
  305. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/silence_utils.py +0 -0
  306. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/stack_tracer.py +0 -0
  307. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/task_queue.py +0 -0
  308. {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/time_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: robusta-api
3
- Version: 0.50.0
3
+ Version: 0.51.0
4
4
  Summary:
5
5
  Author: Arik Alon
6
6
  Author-email: arikalon1@users.noreply.github.com
@@ -10,6 +10,7 @@ Classifier: Programming Language :: Python :: 3.10
10
10
  Classifier: Programming Language :: Python :: 3.11
11
11
  Provides-Extra: all
12
12
  Requires-Dist: Flask (>=3.1.3,<4.0.0) ; extra == "all"
13
+ Requires-Dist: anyio (>=4.14.2,<5.0.0)
13
14
  Requires-Dist: apprise (==1.6.0)
14
15
  Requires-Dist: attrs (>=23.1.0,<24.0.0)
15
16
  Requires-Dist: better-exceptions (>=0.3.3,<0.4.0) ; extra == "all"
@@ -44,7 +45,6 @@ Requires-Dist: prometrix (==0.2.11)
44
45
  Requires-Dist: pyasn1 (>=0.6.4)
45
46
  Requires-Dist: pydantic (>=2.11.7,<3.0.0)
46
47
  Requires-Dist: pydash (==8.0.0)
47
- Requires-Dist: pygal (>=3.0.0,<4.0.0)
48
48
  Requires-Dist: pyjwt (>=2.13.0,<3.0.0)
49
49
  Requires-Dist: pymsteams (>=0.1.16,<0.2.0)
50
50
  Requires-Dist: python-json-logger (>=3.0.0,<4.0.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "robusta-api"
3
- version = "0.50.0"
3
+ version = "0.51.0"
4
4
  description = ""
5
5
  authors = ["Arik Alon <arikalon1@users.noreply.github.com>"]
6
6
  packages = [
@@ -47,7 +47,6 @@ datadog-api-client = { version = "^1.2.0", optional = true }
47
47
  dpath = "^2.0.5"
48
48
  websocket-client = "1.3.3"
49
49
  prometheus-client = "^0.12.0"
50
- pygal = "^3.0.0"
51
50
  pyyaml = "^6.0"
52
51
  pytz = "^2021.3"
53
52
  poetry-core = "1.1.0a7"
@@ -95,6 +94,8 @@ h2 = "^4.3.0"
95
94
  # Pin to fix CVE-2026-30922 (transitive via google-auth)
96
95
  # Bump to fix CVE-2026-59885, CVE-2026-59886 (High)
97
96
  pyasn1 = ">=0.6.4"
97
+ # Pin to fix CVE-2026-63374 (Critical) + CVE-2026-64847 (Medium) (transitive via httpx)
98
+ anyio = "^4.14.2"
98
99
  # Pin to fix CVE-2026-22701 (transitive via virtualenv/pre-commit)
99
100
  filelock = ">=3.20.3"
100
101
  # Pin to fix CVE-2026-22702 (transitive via pre-commit)
@@ -154,8 +155,8 @@ all = ["Flask", "grafana-api", "watchdog", "better-exceptions", "tabulate", "kaf
154
155
  sphinx-jinja = { git = "https://github.com/robusta-dev/sphinx-jinja.git" }
155
156
  sphinx-reredirects = "^0.1.1"
156
157
  freezegun = "^1.4.0"
157
- # Bump to fix CVE-2026-49853, CVE-2026-49855 (High) and GHSA-pw6j-qg29-8w7f (Medium)
158
- tornado = "^6.5.7"
158
+ # Bump to fix CVE-2026-82397 (High)
159
+ tornado = "^6.5.8"
159
160
  responses = "^0.25.7"
160
161
 
161
162
  [build-system]
@@ -1,2 +1,2 @@
1
1
  # this is updated by .github/workflows/release.yaml
2
- __version__ = "0.50.0"
2
+ __version__ = "0.51.0"
@@ -191,6 +191,7 @@ from robusta.core.reporting.consts import (
191
191
  ScanType,
192
192
  SlackAnnotations,
193
193
  )
194
+ from robusta.core.reporting.charts import BarChart, ChartStyle, TreemapChart, XYChart
194
195
  from robusta.core.reporting.custom_rendering import RendererType, charts_style, render_value
195
196
  from robusta.core.reporting.finding_subjects import KubeObjFindingSubject, PodFindingSubject
196
197
  from robusta.core.reporting.holmes import HolmesRequest, HolmesResult, HolmesResultsBlock
@@ -6,7 +6,6 @@ from string import Template
6
6
  from typing import Any, Callable, Dict, List, Optional, Tuple, Union
7
7
 
8
8
  import humanize
9
- import pygal
10
9
  from hikaru.model.rel_1_26 import Node
11
10
  from prometrix import PrometheusQueryResult
12
11
  from pydantic.v1 import BaseModel
@@ -19,7 +18,8 @@ from robusta.core.model.base_params import (
19
18
  )
20
19
  from robusta.core.model.env_vars import FLOAT_PRECISION_LIMIT, PROMETHEUS_REQUEST_TIMEOUT_SECONDS
21
20
  from robusta.core.reporting.blocks import GraphBlock, PrometheusBlock, PrometheusBlockLineData
22
- from robusta.core.reporting.custom_rendering import PlotCustomCSS, charts_style
21
+ from robusta.core.reporting.charts import XYChart
22
+ from robusta.core.reporting.custom_rendering import charts_style
23
23
  from robusta.integrations.prometheus.utils import get_prometheus_connect
24
24
 
25
25
  ResourceKey = Tuple[ResourceChartResourceType, ResourceChartItemType]
@@ -46,17 +46,11 @@ class PlotData:
46
46
  self,
47
47
  plot: Tuple[str, List[Tuple]],
48
48
  color: str,
49
- stroke_style: Optional[Dict[str, Any]] = None,
50
- stroke: Optional[bool] = True,
51
- show_dots: bool = True,
52
- dots_size: Optional[int] = None,
49
+ dasharray: Optional[str] = None,
53
50
  ):
54
51
  self.plot = plot
55
52
  self.color = color
56
- self.stroke_style = stroke_style
57
- self.stroke = stroke
58
- self.show_dots = show_dots
59
- self.dots_size = dots_size
53
+ self.dasharray = dasharray
60
54
 
61
55
 
62
56
  def __prepare_promql_query(provided_labels: Dict[Any, Any], promql_query_template: str) -> str:
@@ -162,7 +156,7 @@ def create_chart_from_prometheus_query(
162
156
  filter_prom_jobs: bool = False,
163
157
  hide_legends: Optional[bool] = False,
164
158
  metrics_legends_labels: Optional[List[str]] = None,
165
- ) -> Tuple[pygal.Graph, PrometheusBlock]:
159
+ ) -> Tuple[XYChart, PrometheusBlock]:
166
160
  starts_at: datetime
167
161
  ends_at: datetime
168
162
  if not alert_starts_at:
@@ -197,7 +191,6 @@ def create_chart_from_prometheus_query(
197
191
  f"Unsupported query result for robusta chart, Type received: {prometheus_query_result.result_type}, type supported 'matrix'"
198
192
  )
199
193
 
200
- # fix a pygal bug which causes infinite loops due to rounding errors with floating points
201
194
  # TODO: change min_time time before Jan 19 3001
202
195
  HIGHEST_END = 32536799999
203
196
  LOWEST_START = 0
@@ -237,12 +230,7 @@ def create_chart_from_prometheus_query(
237
230
  min_time = min(min_time, starts_at.timestamp())
238
231
  max_time = max(max_time, ends_at.timestamp())
239
232
 
240
- plot_data = PlotData(
241
- plot=(label, values),
242
- color="#3F3F3F",
243
- show_dots=False,
244
- stroke_style={"width": 8, "dasharray": "8", "linecap": "round", "linejoin": "round"},
245
- )
233
+ plot_data = PlotData(plot=(label, values), color="#3F3F3F", dasharray="8")
246
234
  plot_data_list.append(plot_data)
247
235
 
248
236
  if min_time == HIGHEST_END: # no data on time series
@@ -284,12 +272,7 @@ def create_chart_from_prometheus_query(
284
272
  elif line.label == "OOM Kill Time":
285
273
  value = [(line.value, max_y_value), (line.value, 0)]
286
274
 
287
- plot_data = PlotData(
288
- plot=(line.label, value),
289
- color="#FF5959",
290
- show_dots=False,
291
- stroke_style={"width": 6, "dasharray": "3, 6", "linecap": "round", "linejoin": "round"},
292
- )
275
+ plot_data = PlotData(plot=(line.label, value), color="#FF5959", dasharray="3, 6")
293
276
 
294
277
  else:
295
278
  plot_data = PlotData(plot=(line.label, value), color="#2a0065")
@@ -298,18 +281,19 @@ def create_chart_from_prometheus_query(
298
281
 
299
282
  graph_plot_color_list = [plot_data.color for plot_data in plot_data_list]
300
283
  graph_plot_color_list.extend(["#1e0047", "#2a0065"])
301
- config = pygal.Config()
302
- custom_css = PlotCustomCSS().get_css_file_path()
303
- config.css.append(f"file://{custom_css}")
304
- chart = pygal.XY(
305
- config,
306
- show_dots=True,
284
+ value_formatters = {
285
+ ChartValuesFormat.Plain: lambda val: str(val),
286
+ ChartValuesFormat.Bytes: lambda val: humanize.naturalsize(val, binary=True),
287
+ ChartValuesFormat.Percentage: lambda val: f"{(100 * val):.1f}%",
288
+ ChartValuesFormat.CPUUsage: lambda val: f"{(1000 * val):.1f}m",
289
+ }
290
+ chart_values_format = values_format if values_format else ChartValuesFormat.Plain
291
+ chart = XYChart(
307
292
  style=charts_style(graph_colors=tuple(graph_plot_color_list)),
308
- truncate_legend=15,
309
- include_x_axis=include_x_axis,
310
- width=1280,
311
- height=500,
293
+ title=chart_title if chart_title else promql_query,
312
294
  show_legend=hide_legends is not True,
295
+ value_formatter=value_formatters[chart_values_format],
296
+ x_value_formatter=lambda timestamp: datetime.fromtimestamp(timestamp).strftime("%b %-d %H:%M"),
313
297
  )
314
298
 
315
299
  # delta and limit line adjustment for case when there is no data
@@ -328,7 +312,7 @@ def create_chart_from_prometheus_query(
328
312
 
329
313
  # Fix for the case when the request and limit has the same value.
330
314
  # 6 pixels where chosen as minimum distance based on current width and height of the slack graph
331
- delta = (chart.range[1] - chart.range[0]) * 6 / chart.config.height
315
+ delta = (chart.range[1] - chart.range[0]) * 6 / chart.height
332
316
  # Limit delta to a maximum of 2% of the Y-axis range (to prefent significant deviation)
333
317
  delta = min(delta, (chart.range[1] - chart.range[0]) * 0.02)
334
318
 
@@ -342,36 +326,8 @@ def create_chart_from_prometheus_query(
342
326
  else:
343
327
  # For non-percentage formats, round the Y-axis labels to the nearest whole number
344
328
  chart.y_labels = [round(i * interval) for i in range(y_axis_division)]
345
-
346
- chart.y_labels_major = chart.y_labels
347
329
  else:
348
330
  chart.y_labels = []
349
- chart.show_minor_y_labels = False
350
-
351
- chart.show_x_guides = True
352
- chart.show_y_guides = True
353
- chart.spacing = 20
354
- chart.margin_top = 10
355
- chart.margin_bottom = 50
356
- chart.x_label_rotation = 35
357
- chart.truncate_label = -1
358
- chart.x_value_formatter = lambda timestamp: datetime.fromtimestamp(timestamp).strftime("%b %-d %H:%M")
359
- chart.legend_at_bottom = True
360
- chart.legend_at_bottom_columns = 5
361
- chart.legend_box_size = 8
362
- value_formatters = {
363
- ChartValuesFormat.Plain: lambda val: str(val),
364
- ChartValuesFormat.Bytes: lambda val: humanize.naturalsize(val, binary=True),
365
- ChartValuesFormat.Percentage: lambda val: f"{(100 * val):.1f}%",
366
- ChartValuesFormat.CPUUsage: lambda val: f"{(1000 * val):.1f}m",
367
- }
368
- chart_values_format = values_format if values_format else ChartValuesFormat.Plain
369
- chart.value_formatter = value_formatters[chart_values_format]
370
-
371
- if chart_title:
372
- chart.title = chart_title
373
- else:
374
- chart.title = promql_query
375
331
 
376
332
  # Adjust the "Limit" line's plotting data if limit and request lines are equal
377
333
  if limit_line_adjusted:
@@ -382,14 +338,7 @@ def create_chart_from_prometheus_query(
382
338
  break
383
339
 
384
340
  for p in plot_data_list:
385
- chart.add(
386
- p.plot[0],
387
- p.plot[1],
388
- stroke_style=p.stroke_style,
389
- show_dots=p.show_dots,
390
- dots_size=p.dots_size,
391
- stroke=p.stroke,
392
- )
341
+ chart.add(p.plot[0], p.plot[1], dasharray=p.dasharray)
393
342
  return chart, PrometheusBlock(
394
343
  data=prometheus_query_result,
395
344
  query=promql_query,
@@ -405,7 +354,7 @@ def build_chart_from_prometheus_result(
405
354
  prometheus_query_result: PrometheusQueryResult,
406
355
  chart_title: Optional[str] = "Prometheus Chart",
407
356
  values_format: Optional[ChartValuesFormat] = None,
408
- ) -> pygal.Graph:
357
+ ) -> XYChart:
409
358
  if prometheus_query_result.result_type != "matrix":
410
359
  raise ValueError(f"Expected 'matrix' result_type, got '{prometheus_query_result.result_type}'")
411
360
 
@@ -464,33 +413,27 @@ def build_chart_from_prometheus_result(
464
413
  min_time = min(min_time, min(series["timestamps"]))
465
414
  max_time = max(max_time, max(series["timestamps"]))
466
415
 
467
- plot_data = PlotData(
468
- plot=(label, values),
469
- color=COLOR_PALETTE[i % len(COLOR_PALETTE)],
470
- show_dots=False,
471
- stroke_style={"width": 8, "dasharray": "8", "linecap": "round", "linejoin": "round"},
472
- )
416
+ plot_data = PlotData(plot=(label, values), color=COLOR_PALETTE[i % len(COLOR_PALETTE)], dasharray="8")
473
417
  plot_data_list.append(plot_data)
474
418
 
475
419
  if min_time == HIGHEST_END:
476
420
  raise ValueError("No valid data points found in time series.")
477
421
 
478
- config = pygal.Config()
479
- custom_css = PlotCustomCSS().get_css_file_path()
480
- config.css.append(f"file://{custom_css}")
481
-
482
422
  graph_colors = [plot_data.color for plot_data in plot_data_list]
483
423
  graph_colors.extend(["#1e0047", "#2a0065"])
484
424
 
485
- chart = pygal.XY(
486
- config,
487
- show_dots=True,
425
+ value_formatters = {
426
+ ChartValuesFormat.Plain: lambda val: str(val),
427
+ ChartValuesFormat.Bytes: lambda val: humanize.naturalsize(val, binary=True),
428
+ ChartValuesFormat.Percentage: lambda val: f"{(100 * val):.1f}%",
429
+ ChartValuesFormat.CPUUsage: lambda val: f"{(1000 * val):.1f}m",
430
+ }
431
+ chart = XYChart(
488
432
  style=charts_style(graph_colors=tuple(graph_colors)),
489
- truncate_legend=15,
490
- include_x_axis=True,
491
- width=1280,
492
- height=500,
433
+ title=chart_title,
493
434
  show_legend=True,
435
+ value_formatter=value_formatters.get(values_format, lambda val: str(val)),
436
+ x_value_formatter=lambda timestamp: datetime.fromtimestamp(timestamp).strftime("%b %-d %H:%M"),
494
437
  )
495
438
 
496
439
  chart.range = (0, max_y_value + (max_y_value * 0.2))
@@ -499,39 +442,9 @@ def build_chart_from_prometheus_result(
499
442
  chart.y_labels = [round(i * interval * 100) / 100 for i in range(5)]
500
443
  else:
501
444
  chart.y_labels = [round(i * interval) for i in range(5)]
502
- chart.y_labels_major = chart.y_labels
503
-
504
- chart.show_x_guides = True
505
- chart.show_y_guides = True
506
- chart.spacing = 20
507
- chart.margin_top = 10
508
- chart.margin_bottom = 50
509
- chart.x_label_rotation = 35
510
- chart.truncate_label = -1
511
- chart.x_value_formatter = lambda timestamp: datetime.fromtimestamp(timestamp).strftime("%b %-d %H:%M")
512
- chart.legend_at_bottom = True
513
- chart.legend_at_bottom_columns = 5
514
- chart.legend_box_size = 8
515
-
516
- value_formatters = {
517
- ChartValuesFormat.Plain: lambda val: str(val),
518
- ChartValuesFormat.Bytes: lambda val: humanize.naturalsize(val, binary=True),
519
- ChartValuesFormat.Percentage: lambda val: f"{(100 * val):.1f}%",
520
- ChartValuesFormat.CPUUsage: lambda val: f"{(1000 * val):.1f}m",
521
- }
522
- chart.value_formatter = value_formatters.get(values_format, lambda val: str(val))
523
-
524
- chart.title = chart_title
525
445
 
526
446
  for plot_data in plot_data_list:
527
- chart.add(
528
- plot_data.plot[0],
529
- plot_data.plot[1],
530
- stroke_style=plot_data.stroke_style,
531
- show_dots=plot_data.show_dots,
532
- dots_size=plot_data.dots_size,
533
- stroke=plot_data.stroke,
534
- )
447
+ chart.add(plot_data.plot[0], plot_data.plot[1], dasharray=plot_data.dasharray)
535
448
 
536
449
  return chart
537
450