From 1b05b607387048ec6e502acc8547ada763e2905c Mon Sep 17 00:00:00 2001 From: Joey Orlando Date: Tue, 31 Oct 2023 16:00:55 -0400 Subject: [PATCH 01/11] add missing db migrations + add additional backend db migration check to CI (#3234) # What this PR does - add missing db migration files generated via `python manage.py makemigrations` - fail the `lint-migrations-backend-mysql-rabbitmq` GitHub Actions CI job if there are missing Django database migration files --- .github/workflows/linting-and-tests.yml | 3 ++ ..._alertreceivechannel_maintenance_author.py | 20 +++++++++++ ..._alter_oncallschedule_polymorphic_ctype.py | 20 +++++++++++ ..._twiliophonecallsender_account_and_more.py | 35 +++++++++++++++++++ ...7_alter_organization_maintenance_author.py | 19 ++++++++++ ...alter_zvonokphonecall_phone_call_record.py | 20 +++++++++++ 6 files changed, 117 insertions(+) create mode 100644 engine/apps/alerts/migrations/0035_alter_alertreceivechannel_maintenance_author.py create mode 100644 engine/apps/schedules/migrations/0017_alter_oncallschedule_polymorphic_ctype.py create mode 100644 engine/apps/twilioapp/migrations/0008_alter_twiliophonecallsender_account_and_more.py create mode 100644 engine/apps/user_management/migrations/0017_alter_organization_maintenance_author.py create mode 100644 engine/apps/zvonok/migrations/0002_alter_zvonokphonecall_phone_call_record.py diff --git a/.github/workflows/linting-and-tests.yml b/.github/workflows/linting-and-tests.yml index 1281dc7c..f077805e 100644 --- a/.github/workflows/linting-and-tests.yml +++ b/.github/workflows/linting-and-tests.yml @@ -124,8 +124,11 @@ jobs: engine/requirements-dev.txt - name: Lint migrations working-directory: engine + # makemigrations --check = Exit with a non-zero status if model changes are missing migrations + # and don't actually write them. run: | pip install -r requirements.txt -r requirements-dev.txt + python manage.py makemigrations --check python manage.py lintmigrations unit-test-helm-chart: diff --git a/engine/apps/alerts/migrations/0035_alter_alertreceivechannel_maintenance_author.py b/engine/apps/alerts/migrations/0035_alter_alertreceivechannel_maintenance_author.py new file mode 100644 index 00000000..3d0362d6 --- /dev/null +++ b/engine/apps/alerts/migrations/0035_alter_alertreceivechannel_maintenance_author.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.6 on 2023-10-31 19:56 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('user_management', '0017_alter_organization_maintenance_author'), + ('alerts', '0034_alter_resolutionnote_source'), + ] + + operations = [ + migrations.AlterField( + model_name='alertreceivechannel', + name='maintenance_author', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_maintenances_created', to='user_management.user'), + ), + ] diff --git a/engine/apps/schedules/migrations/0017_alter_oncallschedule_polymorphic_ctype.py b/engine/apps/schedules/migrations/0017_alter_oncallschedule_polymorphic_ctype.py new file mode 100644 index 00000000..c4b082bf --- /dev/null +++ b/engine/apps/schedules/migrations/0017_alter_oncallschedule_polymorphic_ctype.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.6 on 2023-10-31 19:56 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('schedules', '0016_alter_shiftswaprequest_created_at'), + ] + + operations = [ + migrations.AlterField( + model_name='oncallschedule', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype'), + ), + ] diff --git a/engine/apps/twilioapp/migrations/0008_alter_twiliophonecallsender_account_and_more.py b/engine/apps/twilioapp/migrations/0008_alter_twiliophonecallsender_account_and_more.py new file mode 100644 index 00000000..8ff27a20 --- /dev/null +++ b/engine/apps/twilioapp/migrations/0008_alter_twiliophonecallsender_account_and_more.py @@ -0,0 +1,35 @@ +# Generated by Django 4.2.6 on 2023-10-31 19:56 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('phone_notifications', '0001_initial'), + ('twilioapp', '0007_delete_twiliologrecord'), + ] + + operations = [ + migrations.AlterField( + model_name='twiliophonecallsender', + name='account', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_account', to='twilioapp.twilioaccount'), + ), + migrations.AlterField( + model_name='twiliosms', + name='sms_record', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_related', related_query_name='%(app_label)s_%(class)ss', to='phone_notifications.smsrecord'), + ), + migrations.AlterField( + model_name='twiliosmssender', + name='account', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_account', to='twilioapp.twilioaccount'), + ), + migrations.AlterField( + model_name='twilioverificationsender', + name='account', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_account', to='twilioapp.twilioaccount'), + ), + ] diff --git a/engine/apps/user_management/migrations/0017_alter_organization_maintenance_author.py b/engine/apps/user_management/migrations/0017_alter_organization_maintenance_author.py new file mode 100644 index 00000000..96aedccc --- /dev/null +++ b/engine/apps/user_management/migrations/0017_alter_organization_maintenance_author.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.6 on 2023-10-31 19:56 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('user_management', '0016_alter_user_role'), + ] + + operations = [ + migrations.AlterField( + model_name='organization', + name='maintenance_author', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_maintenances_created', to='user_management.user'), + ), + ] diff --git a/engine/apps/zvonok/migrations/0002_alter_zvonokphonecall_phone_call_record.py b/engine/apps/zvonok/migrations/0002_alter_zvonokphonecall_phone_call_record.py new file mode 100644 index 00000000..461c75fe --- /dev/null +++ b/engine/apps/zvonok/migrations/0002_alter_zvonokphonecall_phone_call_record.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.6 on 2023-10-31 19:56 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('phone_notifications', '0001_initial'), + ('zvonok', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='zvonokphonecall', + name='phone_call_record', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_related', related_query_name='%(app_label)s_%(class)ss', to='phone_notifications.phonecallrecord'), + ), + ] From b8ad7bf99b8fee7ed8cd70357e87ca5760287fe9 Mon Sep 17 00:00:00 2001 From: Joey Orlando Date: Tue, 31 Oct 2023 16:10:45 -0400 Subject: [PATCH 02/11] remove all references to deprecated AlertGroup.is_restricted field (#3228) # What this PR does remove all references to deprecated `AlertGroup.is_restricted` field + leave a note to remove the column in a future release --- .../escalation_snapshot/escalation_snapshot_mixin.py | 3 +-- .../renderers/classic_markdown_renderer.py | 11 ++++------- .../incident_appearance/renderers/web_renderer.py | 11 ++++------- engine/apps/alerts/models/alert_group.py | 1 + engine/apps/api/serializers/alert.py | 3 +-- engine/apps/api/serializers/alert_group.py | 1 - engine/apps/public_api/serializers/alerts.py | 2 +- engine/apps/public_api/serializers/incidents.py | 3 +-- engine/common/constants/alert_group_restrictions.py | 2 -- 9 files changed, 13 insertions(+), 24 deletions(-) delete mode 100644 engine/common/constants/alert_group_restrictions.py diff --git a/engine/apps/alerts/escalation_snapshot/escalation_snapshot_mixin.py b/engine/apps/alerts/escalation_snapshot/escalation_snapshot_mixin.py index e1e8ed6f..e835eb69 100644 --- a/engine/apps/alerts/escalation_snapshot/escalation_snapshot_mixin.py +++ b/engine/apps/alerts/escalation_snapshot/escalation_snapshot_mixin.py @@ -247,10 +247,9 @@ class EscalationSnapshotMixin: is_on_maintenance_or_debug_mode = self.channel.maintenance_mode is not None - if self.is_restricted or is_on_maintenance_or_debug_mode or not self.escalation_chain_exists: + if is_on_maintenance_or_debug_mode or not self.escalation_chain_exists: logger.debug( f"Not escalating alert group w/ pk: {self.pk}\n" - f"is_restricted: {self.is_restricted}\n" f"is_on_maintenance_or_debug_mode: {is_on_maintenance_or_debug_mode}\n" f"escalation_chain_exists: {self.escalation_chain_exists}" ) diff --git a/engine/apps/alerts/incident_appearance/renderers/classic_markdown_renderer.py b/engine/apps/alerts/incident_appearance/renderers/classic_markdown_renderer.py index 44c58fac..e55cf543 100644 --- a/engine/apps/alerts/incident_appearance/renderers/classic_markdown_renderer.py +++ b/engine/apps/alerts/incident_appearance/renderers/classic_markdown_renderer.py @@ -1,6 +1,5 @@ from apps.alerts.incident_appearance.renderers.base_renderer import AlertBaseRenderer, AlertGroupBaseRenderer from apps.alerts.incident_appearance.templaters import AlertClassicMarkdownTemplater -from common.constants.alert_group_restrictions import IS_RESTRICTED_MESSAGE, IS_RESTRICTED_TITLE from common.utils import str_or_backup @@ -11,13 +10,11 @@ class AlertClassicMarkdownRenderer(AlertBaseRenderer): def render(self): templated_alert = self.templated_alert - is_restricted = self.alert.group.is_restricted - return { - "title": IS_RESTRICTED_TITLE if is_restricted else str_or_backup(templated_alert.title, "Alert"), - "message": IS_RESTRICTED_MESSAGE if is_restricted else str_or_backup(templated_alert.message, ""), - "image_url": None if is_restricted else str_or_backup(templated_alert.image_url, None), - "source_link": None if is_restricted else str_or_backup(templated_alert.source_link, None), + "title": str_or_backup(templated_alert.title, "Alert"), + "message": str_or_backup(templated_alert.message, ""), + "image_url": str_or_backup(templated_alert.image_url, None), + "source_link": str_or_backup(templated_alert.source_link, None), } diff --git a/engine/apps/alerts/incident_appearance/renderers/web_renderer.py b/engine/apps/alerts/incident_appearance/renderers/web_renderer.py index 616a5f52..0a096e43 100644 --- a/engine/apps/alerts/incident_appearance/renderers/web_renderer.py +++ b/engine/apps/alerts/incident_appearance/renderers/web_renderer.py @@ -1,6 +1,5 @@ from apps.alerts.incident_appearance.renderers.base_renderer import AlertBaseRenderer, AlertGroupBaseRenderer from apps.alerts.incident_appearance.templaters import AlertWebTemplater -from common.constants.alert_group_restrictions import IS_RESTRICTED_MESSAGE, IS_RESTRICTED_TITLE from common.utils import str_or_backup @@ -11,13 +10,11 @@ class AlertWebRenderer(AlertBaseRenderer): def render(self): templated_alert = self.templated_alert - is_restricted = self.alert.group.is_restricted - return { - "title": IS_RESTRICTED_TITLE if is_restricted else str_or_backup(templated_alert.title, "Alert"), - "message": IS_RESTRICTED_MESSAGE if is_restricted else str_or_backup(templated_alert.message, ""), - "image_url": None if is_restricted else str_or_backup(templated_alert.image_url, None), - "source_link": None if is_restricted else str_or_backup(templated_alert.source_link, None), + "title": str_or_backup(templated_alert.title, "Alert"), + "message": str_or_backup(templated_alert.message, ""), + "image_url": str_or_backup(templated_alert.image_url, None), + "source_link": str_or_backup(templated_alert.source_link, None), } diff --git a/engine/apps/alerts/models/alert_group.py b/engine/apps/alerts/models/alert_group.py index 17051911..983b0ba1 100644 --- a/engine/apps/alerts/models/alert_group.py +++ b/engine/apps/alerts/models/alert_group.py @@ -389,6 +389,7 @@ class AlertGroup(AlertGroupSlackRenderingMixin, EscalationSnapshotMixin, models. # https://code.djangoproject.com/ticket/28545 is_open_for_grouping = models.BooleanField(default=None, null=True, blank=True) + # TODO: drop this column in an upcoming release is_restricted = models.BooleanField(default=False, null=True) @staticmethod diff --git a/engine/apps/api/serializers/alert.py b/engine/apps/api/serializers/alert.py index 626408dd..7774b946 100644 --- a/engine/apps/api/serializers/alert.py +++ b/engine/apps/api/serializers/alert.py @@ -71,5 +71,4 @@ class AlertRawSerializer(serializers.ModelSerializer): ] def get_raw_request_data(self, obj): - # TODO: - return {} if obj.group.is_restricted else obj.raw_request_data + return obj.raw_request_data diff --git a/engine/apps/api/serializers/alert_group.py b/engine/apps/api/serializers/alert_group.py index 3a46583f..8cf44181 100644 --- a/engine/apps/api/serializers/alert_group.py +++ b/engine/apps/api/serializers/alert_group.py @@ -149,7 +149,6 @@ class AlertGroupListSerializer(EagerLoadingMixin, AlertGroupFieldsCacheSerialize "status", "declare_incident_link", "team", - "is_restricted", ] @extend_schema_field( diff --git a/engine/apps/public_api/serializers/alerts.py b/engine/apps/public_api/serializers/alerts.py index 755d38fd..a033c2a2 100644 --- a/engine/apps/public_api/serializers/alerts.py +++ b/engine/apps/public_api/serializers/alerts.py @@ -21,4 +21,4 @@ class AlertSerializer(EagerLoadingMixin, serializers.ModelSerializer): ] def get_payload(self, obj): - return {} if obj.group.is_restricted else obj.raw_request_data + return obj.raw_request_data diff --git a/engine/apps/public_api/serializers/incidents.py b/engine/apps/public_api/serializers/incidents.py index 0c1b8cbe..1a6b2df5 100644 --- a/engine/apps/public_api/serializers/incidents.py +++ b/engine/apps/public_api/serializers/incidents.py @@ -4,7 +4,6 @@ from rest_framework import serializers from apps.alerts.models import AlertGroup from apps.telegram.models.message import TelegramMessage from common.api_helpers.mixins import EagerLoadingMixin -from common.constants.alert_group_restrictions import IS_RESTRICTED_TITLE class IncidentSerializer(EagerLoadingMixin, serializers.ModelSerializer): @@ -42,7 +41,7 @@ class IncidentSerializer(EagerLoadingMixin, serializers.ModelSerializer): ] def get_title(self, obj): - return IS_RESTRICTED_TITLE if obj.is_restricted else obj.web_title_cache + return obj.web_title_cache def get_alerts_count(self, obj): return len(obj.alerts.all()) diff --git a/engine/common/constants/alert_group_restrictions.py b/engine/common/constants/alert_group_restrictions.py deleted file mode 100644 index b30f2da6..00000000 --- a/engine/common/constants/alert_group_restrictions.py +++ /dev/null @@ -1,2 +0,0 @@ -IS_RESTRICTED_TITLE = "UPGRADE TO SEE MORE" -IS_RESTRICTED_MESSAGE = "UPGRADE TO SEE MORE" From 6fbc7bebda93ebbe1642a1c75dee8058a5b974e5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 11:05:51 +0000 Subject: [PATCH 03/11] Update `make docs` procedure (#3235) Signed-off-by: Jack Baldry Co-authored-by: grafanabot Co-authored-by: Jack Baldry --- .github/workflows/update-make-docs.yml | 6 +++--- docs/make-docs | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/update-make-docs.yml b/.github/workflows/update-make-docs.yml index 6a358ecf..4d4ce6a5 100644 --- a/.github/workflows/update-make-docs.yml +++ b/.github/workflows/update-make-docs.yml @@ -12,16 +12,16 @@ jobs: - name: Update procedure run: | + BRANCH=update-make-docs + git checkout -b "${BRANCH}" curl -s -Lo docs/docs.mk https://raw.githubusercontent.com/grafana/writers-toolkit/main/docs/docs.mk curl -s -Lo docs/make-docs https://raw.githubusercontent.com/grafana/writers-toolkit/main/docs/make-docs if git diff --exit-code; then exit 0; fi - BRANCH="$(date +%Y-%m-%d)/update-make-docs" - git checkout -b "${BRANCH}" git add . git config --local user.email "bot@grafana.com" git config --local user.name "grafanabot" git commit -m "Update \`make docs\` procedure" git push -v origin "refs/heads/${BRANCH}" - gh pr create --fill --label "pr:no changelog" + gh pr create --fill --label "pr:no changelog" || true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/docs/make-docs b/docs/make-docs index a6cc6b1b..badc36a4 100755 --- a/docs/make-docs +++ b/docs/make-docs @@ -6,6 +6,12 @@ # [Semantic versioning](https://semver.org/) is used to help the reader identify the significance of changes. # Changes are relevant to this script and the support docs.mk GNU Make interface. # +# ## 5.1.1 (2023-10-30) +# +# ### Added +# +# - Support for Datadog and Oracle data source plugins repositories. +# # ## 5.1.0 (2023-10-20) # # ### Added @@ -249,8 +255,10 @@ SOURCES_grafana_cloud_frontend_observability_faro_web_sdk='faro-web-sdk' SOURCES_helm_charts_mimir_distributed='mimir' SOURCES_helm_charts_tempo_distributed='tempo' SOURCES_opentelemetry='opentelemetry-docs' +SOURCES_plugins_grafana_datadog_datasource='datadog-datasource' SOURCES_plugins_grafana_jira_datasource='jira-datasource' SOURCES_plugins_grafana_mongodb_datasource='mongodb-datasource' +SOURCES_plugins_grafana_oracle_datasource='oracle-datasource' SOURCES_plugins_grafana_splunk_datasource='splunk-datasource' VERSIONS_as_code='UNVERSIONED' @@ -261,8 +269,10 @@ VERSIONS_grafana_cloud_k6='UNVERSIONED' VERSIONS_grafana_cloud_data_configuration_integrations='UNVERSIONED' VERSIONS_grafana_cloud_frontend_observability_faro_web_sdk='UNVERSIONED' VERSIONS_opentelemetry='UNVERSIONED' +VERSIONS_plugins_grafana_datadog_datasource='latest' VERSIONS_plugins_grafana_jira_datasource='latest' VERSIONS_plugins_grafana_mongodb_datasource='latest' +VERSIONS_plugins_grafana_oracle_datasource='latest' VERSIONS_plugins_grafana_splunk_datasource='latest' VERSIONS_technical_documentation='UNVERSIONED' VERSIONS_website='UNVERSIONED' @@ -272,8 +282,10 @@ PATHS_grafana_cloud='content/docs/grafana-cloud' PATHS_helm_charts_mimir_distributed='docs/sources/helm-charts/mimir-distributed' PATHS_helm_charts_tempo_distributed='docs/sources/helm-charts/tempo-distributed' PATHS_mimir='docs/sources/mimir' +PATHS_plugins_grafana_datadog_datasource='docs/sources' PATHS_plugins_grafana_jira_datasource='docs/sources' PATHS_plugins_grafana_mongodb_datasource='docs/sources' +PATHS_plugins_grafana_oracle_datasource='docs/sources' PATHS_plugins_grafana_splunk_datasource='docs/sources' PATHS_tempo='docs/sources/tempo' PATHS_website='content' From 341f4fad1d4ccc8cbc76bcd10604d384340faac4 Mon Sep 17 00:00:00 2001 From: Rares Mardare Date: Wed, 1 Nov 2023 13:50:50 +0200 Subject: [PATCH 04/11] Rares/bump labels 1.2.X (#3227) # What this PR does - Bumps `@grafana/labels` to `1.2.1` - Use `LabelTag` from the shared library to display label colorization --- grafana-plugin/package.json | 2 +- .../src/containers/Labels/Labels.tsx | 29 +++++++++++++++++-- .../src/pages/integration/Integration.tsx | 4 +-- .../src/pages/integrations/Integrations.tsx | 5 ++-- grafana-plugin/yarn.lock | 12 ++++---- 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/grafana-plugin/package.json b/grafana-plugin/package.json index 3fa5aaa1..e3b7d1c1 100644 --- a/grafana-plugin/package.json +++ b/grafana-plugin/package.json @@ -113,7 +113,7 @@ "@grafana/data": "^9.2.4", "@grafana/faro-web-sdk": "^1.0.0-beta4", "@grafana/faro-web-tracing": "^1.0.0-beta4", - "@grafana/labels": "^1.1.0", + "@grafana/labels": "~1.2.1", "@grafana/runtime": "9.3.0-beta1", "@grafana/ui": "^9.4.7", "@opentelemetry/api": "^1.3.0", diff --git a/grafana-plugin/src/containers/Labels/Labels.tsx b/grafana-plugin/src/containers/Labels/Labels.tsx index 732c123b..f744e3f9 100644 --- a/grafana-plugin/src/containers/Labels/Labels.tsx +++ b/grafana-plugin/src/containers/Labels/Labels.tsx @@ -1,9 +1,9 @@ import React, { forwardRef, useCallback, useImperativeHandle, useState } from 'react'; -import '@grafana/labels/dist/theme.css'; import ServiceLabels from '@grafana/labels'; import { Field } from '@grafana/ui'; import cn from 'classnames/bind'; +import { isEmpty } from 'lodash-es'; import { observer } from 'mobx-react'; import { LabelKeyValue } from 'models/label/label.types'; @@ -57,6 +57,31 @@ const Labels = observer( }; }, []); + const isValid = () => { + return ( + (propsErrors || []) + .map((error: LabelKeyValue, index) => { + // error object is empty => Valid + if (isEmpty(error)) { + return undefined; + } + const matchingValue = value[index]?.value; + // We have a name for the value => Valid + if (error.value && matchingValue?.name) { + return undefined; + } + const matchingKey = value[index]?.key; + // We have a name for the key => Valid + if (error.key && matchingKey?.name) { + return undefined; + } + // Invalid + return error; + }) + .filter((er: LabelKeyValue) => er).length === 0 + ); + }; + const cachedOnLoadValuesForKey = useCallback(() => { let result = undefined; return async (key: string, search?: string) => { @@ -87,7 +112,7 @@ const Labels = observer( onUpdateValue={labelsStore.updateKeyValue.bind(labelsStore)} onRowItemRemoval={(_pair, _index) => {}} onUpdateError={onUpdateError} - errors={{ ...propsErrors }} + errors={isValid() ? {} : { ...propsErrors }} onDataUpdate={setValue} /> diff --git a/grafana-plugin/src/pages/integration/Integration.tsx b/grafana-plugin/src/pages/integration/Integration.tsx index 5aa62b79..02960843 100644 --- a/grafana-plugin/src/pages/integration/Integration.tsx +++ b/grafana-plugin/src/pages/integration/Integration.tsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; +import { LabelTag } from '@grafana/labels'; import { Button, HorizontalGroup, @@ -11,7 +12,6 @@ import { ConfirmModal, Drawer, Alert, - Tag as GrafanaTag, } from '@grafana/ui'; import cn from 'classnames/bind'; import { get } from 'lodash-es'; @@ -1072,7 +1072,7 @@ const IntegrationHeader: React.FC = ({ {alertReceiveChannel.labels.length ? alertReceiveChannel.labels.map((label) => ( - + )) : 'No labels attached'} diff --git a/grafana-plugin/src/pages/integrations/Integrations.tsx b/grafana-plugin/src/pages/integrations/Integrations.tsx index 64730ffa..d67af530 100644 --- a/grafana-plugin/src/pages/integrations/Integrations.tsx +++ b/grafana-plugin/src/pages/integrations/Integrations.tsx @@ -1,6 +1,7 @@ import React from 'react'; -import { HorizontalGroup, Button, VerticalGroup, Icon, ConfirmModal, Tooltip, Tag } from '@grafana/ui'; +import { LabelTag } from '@grafana/labels'; +import { HorizontalGroup, Button, VerticalGroup, Icon, ConfirmModal, Tooltip } from '@grafana/ui'; import cn from 'classnames/bind'; import { debounce } from 'lodash-es'; import { observer } from 'mobx-react'; @@ -366,7 +367,7 @@ class Integrations extends React.Component {item.labels?.length ? item.labels.map((label) => ( - + - - + {incident.grafana_incident_id === null && ( + + + + + + )}