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.
- {robusta_api-0.50.0 → robusta_api-0.51.0}/PKG-INFO +2 -2
- {robusta_api-0.50.0 → robusta_api-0.51.0}/pyproject.toml +5 -4
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/_version.py +1 -1
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/api/__init__.py +1 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/prometheus_enrichment_utils.py +33 -120
- robusta_api-0.51.0/src/robusta/core/reporting/charts.py +493 -0
- robusta_api-0.51.0/src/robusta/core/reporting/custom_rendering.py +22 -0
- robusta_api-0.50.0/src/robusta/core/reporting/custom_rendering.py +0 -85
- {robusta_api-0.50.0 → robusta_api-0.51.0}/LICENSE +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/clients/robusta_client.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/discovery.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/resource_names.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/top_service_resolver.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/discovery/utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/exceptions.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/base_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/cluster_status.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/env_vars.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/events.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/helm_release.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/jobs.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/k8s_operation_type.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/namespaces.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/nodes.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/openshift_group.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/pods.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/runner_config.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/model/services.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/persistency/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/persistency/in_memory.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/persistency/scheduled_jobs_states_dal.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/actions_registry.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/base_trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/common.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/container_playbook_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/crash_reporter.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/generation.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/CRD_API_DOCUMENTATION.md +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/ai_integration.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/crds.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/internal/discovery_events.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/job_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/node_enrichment_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/node_playbook_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/oom_killer_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/playbook_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/playbooks_event_handler.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/playbooks_event_handler_impl.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/pod_utils/crashloop_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/pod_utils/imagepull_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/pod_utils/pending_pod_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/pubsub/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/pubsub/event_emitter.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/pubsub/event_subscriber.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/pubsub/events_pubsub.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/action_requests.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/base.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/blocks.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/callbacks.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/consts.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/finding_subjects.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/holmes.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/url_helpers.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/reporting/utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/schedule/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/schedule/model.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/schedule/scheduler.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/common/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/common/channel_transformer.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/common/html_tools.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/datadog/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/datadog/datadog_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/datadog/datadog_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/discord/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/discord/discord_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/discord/discord_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/file/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/file/file_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/file/file_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/file/object_traverser.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/google_chat/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/google_chat/google_chat.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/google_chat/google_chat_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/incidentio_api.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/incidentio_client.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/incidentio_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/incidentio/incidentio_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/jira/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/jira/jira_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/jira/jira_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/kafka/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/kafka/kafka_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/kafka/kafka_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mail/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mail/mail_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mail/mail_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mattermost/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mattermost/mattermost_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/mattermost/mattermost_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/msteams/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/msteams/msteams_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/msteams/msteams_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/msteams/msteams_webhook_tranformer.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/opsgenie/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/opsgenie/opsgenie_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/opsgenie/opsgenie_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pagerduty/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pagerduty/pagerduty_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pagerduty/pagerduty_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pushover/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pushover/pushover_client.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pushover/pushover_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/pushover/pushover_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/dal/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/dal/model_conversion.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/dal/supabase_dal.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/discovery_metrics.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/prometheus_discovery_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/robusta_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/robusta_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/account_resource_fetcher.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/base_resource_manager.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/prometheus_alert_resource_manager.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/rrm.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/robusta/rrm/types.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/rocketchat/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/rocketchat/rocketchat_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/rocketchat/rocketchat_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/servicenow/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/servicenow/servicenow_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/servicenow/servicenow_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/sink_base.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/sink_base_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/sink_config.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/sink_factory.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/preview/slack_sink_preview.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/preview/slack_sink_preview_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/slack_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/slack_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/templates/header.j2 +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/slack/templates/template_loader.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/telegram/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/telegram/telegram_client.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/telegram/telegram_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/telegram/telegram_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/timing.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/transformer.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/victorops/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/victorops/victorops_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/victorops/victorops_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webex/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webex/webex_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webex/webex_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webhook/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webhook/webhook_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/webhook/webhook_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/yamessenger/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/yamessenger/yamessenger_client.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/yamessenger/yamessenger_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/yamessenger/yamessenger_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/zulip/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/zulip/zulip_sink.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/sinks/zulip/zulip_sink_params.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/stream/utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/container_oom_killed_trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/custom_triggers.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/error_event_trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/helm_releases_triggers.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/job_failed_trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/multi_resources_trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/oom_killed_trigger_base.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/pod_crash_loop_trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/pod_evicted_trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/pod_image_pull_backoff.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/triggers/pod_oom_killed_trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/argocd/argocd_client.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/common/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/common/requests.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/discord/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/discord/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/git/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/git/git_repo.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/git/well_known_hosts.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/google_chat/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/google_chat/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/grafana.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/helper.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/jira/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/jira/client.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/jira/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/api_client_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/events.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/models.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/triggers.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/v1/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/autogenerated/v1/models.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/base_event.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/base_triggers.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/custom_crds.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/custom_models.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/model_not_found_exception.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/process_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/kubernetes/templates.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mail/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mail/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mattermost/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mattermost/client.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/mattermost/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_adaptive_card_files.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_image.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_text.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_action.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_base.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_card.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_column.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_container.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_images.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_table.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_elements/msteams_text_block.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_mark_down_fix_url.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/msteams_msg.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/msteams/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/openshift/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/openshift/token.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/prometheus/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/prometheus/models.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/prometheus/trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/prometheus/utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/receiver.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/cpu_analyzer.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/memory_analyzer.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/node_cpu_analyzer.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/resource_analysis/prometheus_analyzer.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/rocketchat/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/rocketchat/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/event.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/models.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/playbook_scheduler.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/playbook_scheduler_manager.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/playbook_scheduler_manager_impl.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/scheduled/trigger.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/servicenow/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/servicenow/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/slack/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/slack/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/webex/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/webex/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/zulip/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/integrations/zulip/sender.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/model/alert_relabel_config.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/model/config.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/model/playbook_action.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/model/playbook_definition.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/patch/patch.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/config_loader.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/log_init.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/main.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/not_found_exception.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/object_updater.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/process_setup.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/ssl_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/telemetry.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/telemetry_service.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/web.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/runner/web_api.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/__init__.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/archive.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/auth_provider.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/base64_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/cluster_provider_discovery.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/common.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/decorators.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/docs.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/documented_pydantic.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/error_codes.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/file_system_watcher.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/function_hashes.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/json_schema.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/parsing.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/rate_limiter.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/scope.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/server_start.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/service_discovery.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/silence_utils.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/stack_tracer.py +0 -0
- {robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/utils/task_queue.py +0 -0
- {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.
|
|
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.
|
|
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-
|
|
158
|
-
tornado = "^6.5.
|
|
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.
|
|
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
|
{robusta_api-0.50.0 → robusta_api-0.51.0}/src/robusta/core/playbooks/prometheus_enrichment_utils.py
RENAMED
|
@@ -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.
|
|
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
|
-
|
|
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.
|
|
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[
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
) ->
|
|
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
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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
|
-
|
|
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
|
|