diff --git a/dashboards/hcp-vault/hcp-vault.json b/dashboards/hcp-vault/hcp-vault.json new file mode 100644 index 0000000000..bfc66b7a5b --- /dev/null +++ b/dashboards/hcp-vault/hcp-vault.json @@ -0,0 +1,812 @@ +{ + "name": "HCP Vault", + "description": null, + "pages": [ + { + "name": "Overview", + "description": null, + "widgets": [ + { + "title": "", + "layout": { + "column": 1, + "row": 1, + "width": 1, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "\n\n![New Rellog](https://www.datocms-assets.com/2885/1696356781-vault_verticallogo_black_rgb.svg)\n\n" + } + }, + { + "title": "", + "layout": { + "column": 2, + "row": 1, + "width": 11, + "height": 1 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# HCP Vault Metrics Overview" + } + }, + { + "title": "Vault core Unsealed (1=true)", + "layout": { + "column": 2, + "row": 2, + "width": 2, + "height": 2 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.billboard" + }, + "rawConfiguration": { + "dataFormatters": [ + { + "name": "vault_core_unsealed", + "type": null + } + ], + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT latest(vault_core_unsealed) WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [ + { + "alertSeverity": "WARNING", + "value": 0 + }, + { + "alertSeverity": "CRITICAL", + "value": -1 + } + ] + } + }, + { + "title": "Number of Identity Entities", + "layout": { + "column": 4, + "row": 2, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT average(vault_identity_num_entities) TIMESERIES 5 minutes SINCE 1 hour ago WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Login request duration", + "layout": { + "column": 8, + "row": 2, + "width": 5, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT average(vault_core_handle_login_request) AS 'ms' TIMESERIES 2 minutes SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Leases set to expire", + "layout": { + "column": 1, + "row": 4, + "width": 3, + "height": 2 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.billboard" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT latest(vault_expire_num_leases) as 'leases' WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Policy get", + "layout": { + "column": 4, + "row": 5, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT rate(sum(vault_policy_get_policy_count), 1 minute) as 'Gets per minute' WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) TIMESERIES 5 minutes SINCE 1 hour ago " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Policy set", + "layout": { + "column": 8, + "row": 5, + "width": 5, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT rate(sum(vault_policy_set_policy_count), 1 minute) as 'Sets per minute' WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) TIMESERIES 2 minutes SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Secret Count", + "layout": { + "column": 1, + "row": 6, + "width": 3, + "height": 2 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.billboard" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT max(vault_secret_kv_count) as 'Secrets' WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 8, + "width": 12, + "height": 1 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# Runtime metrics" + } + }, + { + "title": "Total Go routines", + "layout": { + "column": 1, + "row": 9, + "width": 6, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.area" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT average(vault_runtime_num_goroutines) as 'Go routines' WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) TIMESERIES 1 minutes SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Allocated MB", + "layout": { + "column": 7, + "row": 9, + "width": 6, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.area" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT average(vault_runtime_alloc_bytes)/1e+6 as 'MB' WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) TIMESERIES 2 minutes SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Heap Objects used", + "layout": { + "column": 1, + "row": 12, + "width": 6, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.area" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT average((`__result_0` / `__result_1`)) as 'Heap objects used' FROM (SELECT latest(vault_runtime_heap_objects) AS `__result_0`, latest(vault_runtime_malloc_count) AS `__result_1` FROM Metric WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) FACET dimensions() LIMIT max TIMESERIES 2 minutes) SINCE 60 MINUTES AGO UNTIL NOW TIMESERIES 2 minutes" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Count of object on the heap", + "layout": { + "column": 7, + "row": 12, + "width": 6, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.area" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT sum(vault_runtime_heap_objects) WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) TIMESERIES 2 minutes SINCE 1 hour ago UNTIL Now" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 15, + "width": 12, + "height": 1 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# Token related metrics" + } + }, + { + "title": "Available token count", + "layout": { + "column": 1, + "row": 16, + "width": 3, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.billboard" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Metric SELECT latest(vault_token_count) as 'Tokens' WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Tokens by auth method", + "layout": { + "column": 4, + "row": 16, + "width": 3, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT average(vault_token_count_by_auth) FROM Metric WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) FACET auth_method TIMESERIES 2 minutes SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Tokens by ttl Method", + "layout": { + "column": 7, + "row": 16, + "width": 3, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT average(vault_token_count_by_ttl) FROM Metric FACET creation_ttl WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) TIMESERIES 2 minutes SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Tokens by policy", + "layout": { + "column": 10, + "row": 16, + "width": 3, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT average(vault_token_count_by_policy) FROM Metric WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) FACET policy TIMESERIES 2 minutes SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Token creation/storage", + "layout": { + "column": 1, + "row": 19, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT average(vault_token_create) as 'create' FROM Metric WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) TIMESERIES 2 minutes SINCE 1 hour ago UNTIL now" + }, + { + "accountIds": [], + "query": "SELECT average(vault_token_store) as 'store' FROM Metric WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) TIMESERIES 2 minutes SINCE 1 hour ago UNTIL now" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "yAxisLeft": { + "zero": false + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Token lookups", + "layout": { + "column": 5, + "row": 19, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT rate(sum(vault_token_lookup_count), 1 minute) as 'Lookups per minute' FROM Metric WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) TIMESERIES 2 minutes SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "yAxisLeft": { + "zero": false + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Renew/Revoke time (in ms)", + "layout": { + "column": 9, + "row": 19, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT average(vault_expire_revoke) as 'Revoke ms' FROM Metric WHERE project_id IN ({{vault_project}}) AND cluster_id IN ({{vault_cluster}}) SINCE 1 hour ago TIMESERIES 2 minutes" + }, + { + "accountIds": [], + "query": "SELECT average(vault_expire_renew) as 'Renew ms' FROM Metric SINCE 1 hour ago TIMESERIES 5 minutes" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 22, + "width": 12, + "height": 1 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# Audit Logs" + } + }, + { + "title": "Audit Log rate per minute", + "layout": { + "column": 1, + "row": 23, + "width": 6, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT rate(count(*), 1 minute) as 'Logs per minute' FROM Log WHERE hcp_product = 'vault' TIMESERIES 5 minutes UNTIL now" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Error logs (response/request)", + "layout": { + "column": 7, + "row": 23, + "width": 6, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) as 'Response Log Errors' FROM Log WHERE response.data.error IS NOT NULL AND hcp_product='vault' TIMESERIES 5 minutes SINCE 1 hour ago UNTIL NOW" + }, + { + "accountIds": [], + "query": "SELECT count(*) as 'Request Log Errors' FROM Log WHERE request.data.error IS NOT NULL AND hcp_product='vault' TIMESERIES 5 minutes SINCE 1 hour ago UNTIL NOW" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + } + ] + } + ], + "variables": [ + { + "name": "vault_cluster", + "items": null, + "defaultValues": [ + { + "value": { + "string": "*" + } + }, + { + "value": { + "string": "vault-cluster" + } + } + ], + "nrqlQuery": { + "accountIds": [], + "query": "SELECT uniques(cluster_id) FROM Metric WHERE hcp_product='vault'" + }, + "options": { + "ignoreTimeRange": true + }, + "title": "Cluster Id", + "type": "NRQL", + "isMultiSelection": true, + "replacementStrategy": "STRING" + }, + { + "name": "vault_project", + "items": null, + "defaultValues": [ + { + "value": { + "string": "*" + } + }, + { + "value": { + "string": "d8ff14cb-a4ca-4666-8fdb-6f26b8d3a3d9" + } + } + ], + "nrqlQuery": { + "accountIds": [], + "query": "SELECT uniques(project_id) FROM Metric WHERE hcp_product='vault'" + }, + "options": { + "ignoreTimeRange": true + }, + "title": "Project Id", + "type": "NRQL", + "isMultiSelection": true, + "replacementStrategy": "STRING" + } + ] + } \ No newline at end of file diff --git a/dashboards/hcp-vault/hcp-vault01.png b/dashboards/hcp-vault/hcp-vault01.png new file mode 100644 index 0000000000..141c9c4406 Binary files /dev/null and b/dashboards/hcp-vault/hcp-vault01.png differ diff --git a/dashboards/hcp-vault/hcp-vault02.png b/dashboards/hcp-vault/hcp-vault02.png new file mode 100644 index 0000000000..611b50302e Binary files /dev/null and b/dashboards/hcp-vault/hcp-vault02.png differ diff --git a/dashboards/hcp-vault/hcp-vault03.png b/dashboards/hcp-vault/hcp-vault03.png new file mode 100644 index 0000000000..e96d723236 Binary files /dev/null and b/dashboards/hcp-vault/hcp-vault03.png differ diff --git a/dashboards/hcp-vault/hcp-vault04.png b/dashboards/hcp-vault/hcp-vault04.png new file mode 100644 index 0000000000..6b56721f23 Binary files /dev/null and b/dashboards/hcp-vault/hcp-vault04.png differ diff --git a/data-sources/hcp-vault-logs/config.yml b/data-sources/hcp-vault-logs/config.yml new file mode 100644 index 0000000000..542c5491e4 --- /dev/null +++ b/data-sources/hcp-vault-logs/config.yml @@ -0,0 +1,24 @@ +id: hcp-vault-logs +displayName: HCP Vault audit logs +description: | + This integration sends audit logs from your HCP vault clusters. + +icon: logo.svg +install: + primary: + link: + url: https://developer.hashicorp.com/vault/tutorials/cloud-monitoring/vault-audit-log-new-relic + fallback: + link: + url: https://developer.hashicorp.com/vault/tutorials/cloud-monitoring/vault-metrics-guide +keywords: + - hashicorp + - hcp + - cloud + - infrastructure + - newrelic partner + - vault + - secret management +categoryTerms: + - newrelic partner + - infrastructure diff --git a/data-sources/hcp-vault-logs/logo.svg b/data-sources/hcp-vault-logs/logo.svg new file mode 100644 index 0000000000..1dd77b512e --- /dev/null +++ b/data-sources/hcp-vault-logs/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data-sources/hcp-vault-metrics/config.yml b/data-sources/hcp-vault-metrics/config.yml new file mode 100644 index 0000000000..4ef7cc3aaf --- /dev/null +++ b/data-sources/hcp-vault-metrics/config.yml @@ -0,0 +1,25 @@ +id: hcp-vault-metrics +displayName: HCP Vault telemetry metrics +description: | + This integration sends metrics from your HCP vault clusters to New Relic. + +icon: logo.svg +install: + primary: + link: + url: https://developer.hashicorp.com/vault/tutorials/cloud-monitoring/vault-metrics-new-relic + fallback: + link: + url: https://developer.hashicorp.com/vault/tutorials/cloud-monitoring/vault-metrics-guide +keywords: + - hashicorp + - hcp + - cloud + - infrastructure + - newrelic partner + - vault + - secret management + - metrics +categoryTerms: + - newrelic partner + - infrastructure diff --git a/data-sources/hcp-vault-metrics/logo.svg b/data-sources/hcp-vault-metrics/logo.svg new file mode 100644 index 0000000000..1dd77b512e --- /dev/null +++ b/data-sources/hcp-vault-metrics/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/install/third-party/hcp-vault/install.yml b/install/third-party/hcp-vault/install.yml new file mode 100644 index 0000000000..ab8e83b27e --- /dev/null +++ b/install/third-party/hcp-vault/install.yml @@ -0,0 +1,16 @@ +id: third-party-hcp-vault +name: HCP Vault +title: HCP Vault Integration +description: | + This guide details how to deploy the HCP Vault integration, to monitor your Hashicorp HCP Vault environment with New Relic. + +target: + type: integration + destination: cloud + +level: Verified + +install: + mode: link + destination: + url: https://developer.hashicorp.com/vault/tutorials/cloud-monitoring/vault-metrics-guide diff --git a/quickstarts/hashicorp/hcp-vault/config.yml b/quickstarts/hashicorp/hcp-vault/config.yml new file mode 100644 index 0000000000..f57e031332 --- /dev/null +++ b/quickstarts/hashicorp/hcp-vault/config.yml @@ -0,0 +1,47 @@ +slug: hcp-vault +title: HCP Vault +description: |- + ## HCP Vault + + Secure, store, and tightly control access to tokens, passwords, certificates, encryption keys for protecting secrets, and other sensitive data using a UI, CLI, or HTTP API. + + ### Monitor HCP Vault metrics with New Relic + + Metrics observability is essential for ensuring the performance and security of your HCP Vault cluster. It's also useful for business operations, like understanding client-related usage. + + ### HCP Vault integration highlights + The HCP Vault integration with New Relic provides a pre-made dashboard with HCP Vault metrics and audit logs to get started easily. This dashboard provides visibility into the health of your HCP Vault environment. + + - Overview: Monitor key data points like identity entities, policy get/set, secret count, etc. + - Runtime metrics: Keep track of runtime metrics for your Vault instance, including allocated MB's, Heap objects used, etc. + - Token Metrics: Visualize token metrics like available token count, and count faceted by auth or ttl method. + - Audit Logs: review real time audit log rates, and error logs for response or request API errors. +summary: Monitor your HCP Vault environment +level: Verified +authors: + - New Relic Labs +keywords: + - hcp + - vault + - hashicorp + - consul + - nrlabs + - nrlabs-data + - infrastructure + - NR1_addData + - NR1_sys +documentation: + - name: Metrics configuration documentation + url: https://developer.hashicorp.com/vault/tutorials/cloud-monitoring/vault-metrics-new-relic + description: HCP Vault metrics guide + - name: Audit Logs configuration documentation + url: https://developer.hashicorp.com/vault/tutorials/cloud-monitoring/vault-audit-log-new-relic + description: HCP Vault audit logs guide +icon: logo.svg +installPlans: + - third-party-hcp-vault +dataSourceIds: + - hcp-vault-logs + - hcp-vault-metrics +dashboards: + - hcp-vault diff --git a/quickstarts/hashicorp/hcp-vault/logo.svg b/quickstarts/hashicorp/hcp-vault/logo.svg new file mode 100644 index 0000000000..1dd77b512e --- /dev/null +++ b/quickstarts/hashicorp/hcp-vault/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file