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