Skip to content

Add Metrics Dashboard environments API to FF

Sarah Yasonik requested to merge sy-flag-metrics-dashboard-environments into master

What does this MR do and why?

This MR gates the metrics dashboard environments API fields behind the remove_monitor_metrics feature flag. Frontend is done, but we also want to deprecate/remove any API access.

Related issue: Metrics: Delete API entrypoints & helpers (#397138 - closed) (one of many MRs)

Context for removal:

All related backend MRs to flag all metrics dashboard endpoints

How to set up and validate locally

** Pre-req: Access to project with an environment

Entrypoint How to test Before After

EnvironmentsController
#metrics_redirect

In browser, open environment metrics route like: http://gdk.test:3000/namespace1/project-1/-/environments/1/metrics

Page should redirect to http://gdk.test:3000/namespace1/project-1/-/metrics?environment=1

404

EnvironmentsController
#metrics

In browser, open metrics route like:

http://gdk.test:3000/namespace1/project-1/-/environments/1/metrics.json

204 response, or 200 with metrics

404

EnvironmentsController
#additional_metrics

Navigate in browser to route like:
http://gdk.test:3000/namespace1/project-1/-/environments/1/additional_metrics.json?start=1683570533&end=1683743270

204 response, or 200 with additional metrics 404

EnvironmentHelper
#environments_detail_data

  1. Inspect DOM at route like http://gdk.test:3000/namespace1/project-1/-/environments/1
  2. Search for element with id of environments-detail-view
  3. Read data-details key -> look for presence of environment_metrics_path if json
sample output
{
  "name": "environment1",
  "id": 1,
  "project_full_path": "namespace1/project-1",
  "external_url": "https://env1.example.gitlab.com",
  "can_update_environment": true,
  "can_destroy_environment": false,
  "can_stop_environment": true,
  "can_admin_environment": true,
  "environment_metrics_path": "/namespace1/project-1/-/metrics?environment=1",
  "environments_fetch_path": "/namespace1/project-1/-/environments.json",
  "environment_edit_path": "/namespace1/project-1/-/environments/1/edit",
  "environment_stop_path": "/namespace1/project-1/-/environments/1/stop",
  "environment_delete_path": "/api/v4/projects/9/environments/1",
  "environment_cancel_auto_stop_path": "/namespace1/project-1/-/environments/1/cancel_auto_stop",
  "environment_terminal_path": "/namespace1/project-1/-/environments/1/terminal",
  "has_terminals": false,
  "is_environment_available": true,
  "auto_stop_at": null,
  "graphql_etag_key": "/namespace1/project-1/-/environments.json"
}
sample output
{
  "name": "environment1",
  "id": 1,
  "project_full_path": "namespace1/project-1",
  "external_url": "https://env1.example.gitlab.com",
  "can_update_environment": true,
  "can_destroy_environment": false,
  "can_stop_environment": true,
  "can_admin_environment": true,
  "environments_fetch_path": "/namespace1/project-1/-/environments.json",
  "environment_edit_path": "/namespace1/project-1/-/environments/1/edit",
  "environment_stop_path": "/namespace1/project-1/-/environments/1/stop",
  "environment_delete_path": "/api/v4/projects/9/environments/1",
  "environment_cancel_auto_stop_path": "/namespace1/project-1/-/environments/1/cancel_auto_stop",
  "environment_terminal_path": "/namespace1/project-1/-/environments/1/terminal",
  "has_terminals": false,
  "is_environment_available": true,
  "auto_stop_at": null,
  "graphql_etag_key": "/namespace1/project-1/-/environments.json"
}

EnvironmentsHelper
#metrics_data

  1. Disable javascript in your browser
  2. Inspect DOM at route like http://gdk.test:3000/namespace1/project-1/-/metrics?environment=1
  3. Search for element with id of prometheus-graphs
  4. All data attributes should be stripped
  5. Remember to reenable javascript!
sample output
<div 
  data-add-dashboard-documentation-path="/help/operations/metrics/dashboards/index.md#add-a-new-dashboard-to-your-project" 
  data-can-access-operations-settings="true" 
  data-clusters-path="/namespace1/project-1/-/clusters" 
  data-current-environment-name="environment1" 
  data-custom-dashboard-base-path=".gitlab/dashboards" 
  data-custom-metrics-available="true" 
  data-custom-metrics-path="/namespace1/project-1/prometheus/metrics" 
  data-dashboard-endpoint="/namespace1/project-1/-/environments/1/metrics_dashboard.json" 
  data-dashboard-timezone="LOCAL" 
  data-dashboards-endpoint="/namespace1/project-1/-/performance_monitoring/dashboards.json" 
  data-default-branch="master" 
  data-deployments-endpoint="/namespace1/project-1/-/environments/1/deployments.json" 
  data-documentation-path="/help/administration/monitoring/prometheus/index.md" 
  data-empty-getting-started-svg-path="/assets/illustrations/monitoring/getting_started-43b15555f183986a2d08f1baa34e388d08853ad79e81e0e7eea47a3070a50326.svg" 
  data-empty-loading-svg-path="/assets/illustrations/monitoring/loading-c3c50c7eff8570f66935ac996b331bc82362569a1f8f932dd4ebbdb05ddc69fe.svg" 
  data-empty-no-data-small-svg-path="/assets/illustrations/chart-empty-state-small-d02b465c6a6913171032b871ce4390c6d51b21d1765bd8e3de6c9b3c3db162b6.svg" 
  data-empty-no-data-svg-path="/assets/illustrations/monitoring/no_data-f2cab4f6cbe1e4619a8d995830ac5af85bea7b6b9bb3bab349b82ececfcb7828.svg" 
  data-empty-unable-to-connect-svg-path="/assets/illustrations/monitoring/unable_to_connect-ebd14bb254b811ff5ee05dae252012a56fc66ead12a39b85d664819bb9310d50.svg" 
  data-environment-state="available" 
  data-has-metrics="false" 
  data-metrics-dashboard-base-path="/namespace1/project-1/-/metrics" 
  data-metrics-endpoint="/namespace1/project-1/-/environments/1/additional_metrics.json" 
  data-operations-settings-path="/namespace1/project-1/-/settings/operations" 
  data-panel-preview-endpoint="/namespace1/project-1/-/metrics/dashboards/builder.json" 
  data-project-path="/namespace1/project-1" 
  data-settings-path="/namespace1/project-1/-/settings/integrations/prometheus/edit" 
  data-tags-path="/namespace1/project-1/-/tags" 
  data-validate-query-path="/namespace1/project-1/prometheus/metrics/validate_query" 
  id="prometheus-graphs">
</div>
<div id="prometheus-graphs" />

EnvironmentSerializer
#metrics_path

  1. Start gdk with USE_SAMPLE_METRICS env var enabled
    USE_SAMPLE_METRICS=1 gdk start
  2. Navigate to a route like http://gdk.test:3000/namespace1/project-1/-/environments
  3. Open the Network tab of your browser, and find the request like http://gdk.test:3000/namespace1/project-1/-/environments.json

response.environments[0].latest.metrics_path is present

Screenshot 2023-05-10 at 3.43.26 PM.png

response.environments[0].latest.metrics_path is absent

Screenshot 2023-05-10 at 3.44.40 PM.png

EnvironmentType
#metrics_dashboard

  1. Use http://gdk.test:3000/graphql-explorer to query the metricsDashboard field:
sample graphql query
query envs {
  project(fullPath: "namespace1/project-1") {
    environments {
      nodes {
        id
        metricsDashboard(
          path: "config/prometheus/common_metrics.yml"
        ) {
          path
          schemaValidationWarnings
        }
      }
    }
  }
}
sample output
{
  "data": {
    "project": {
      "environments": {
        "nodes": [
          {
            "id": "gid://gitlab/Environment/1",
            "metricsDashboard": {
              "path": "config/prometheus/common_metrics.yml",
              "schemaValidationWarnings": null
            }
          }
        ]
      }
    }
  }
}
sample output
{
  "data": {
    "project": {
      "environments": {
        "nodes": [
          {
            "id": "gid://gitlab/Environment/1",
            "metricsDashboard": null
          }
        ]
      }
    }
  }
}

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Sarah Yasonik

Merge request reports

Loading