diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6f56739e86..e0a4b9dd2b 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -26,3 +26,4 @@ _The owners of this repo are not experts in the subject matter of the quickstart ### Alerts - [ ] Did you check that your alerts actually work? +- [ ] Are you trying to create standalone alerts? Standalone alerts are deprecated. They should only be included in quickstarts. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e7fa2683f6..e08f2ae64c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -476,6 +476,8 @@ exmaple-screenshot2.png Alerts are defined as policies, which are composed of multiple alert conditions. They are located under the `alert-policies/` directory and CANNOT be nested, an alert policy named `example-policy` would live under `alert-policies/example-policy`. Each condition within a policy is defined using a yaml file. For more information on creating New Relic alert conditions, see [Introduction to alerts](https://docs.newrelic.com/docs/alerts-applied-intelligence/new-relic-alerts/learn-alerts/introduction-alerts) +> **DEPRECATION WARNING** - Standalone alerts are deprecated and should only be used in quickstarts. + ```yaml name: Example alert condition @@ -684,7 +686,8 @@ icon.png ``` ## Quickstart Preview -⚠️ There is currently no way to preview Quickstarts locally. + +⚠️ There is currently no way to preview Quickstarts locally.
Deprecated preview steps @@ -722,6 +725,7 @@ icon.png - Once a PR is open for a quickstart, a comment will be automatically generated with a link to the quickstart associated with the PR. - If a PR has multiple quickstarts, a link will be generated in the PR for each quickstart. +
### Feature requests diff --git a/dashboards/jfrog-artifactory-cloud/jfrog-artifactory-cloud01.png b/dashboards/jfrog-artifactory-cloud/jfrog-artifactory-cloud01.png new file mode 100644 index 0000000000..02c67e0a5b Binary files /dev/null and b/dashboards/jfrog-artifactory-cloud/jfrog-artifactory-cloud01.png differ diff --git a/dashboards/jfrog-artifactory-cloud/jfrog-artifactory-cloud02.png b/dashboards/jfrog-artifactory-cloud/jfrog-artifactory-cloud02.png new file mode 100644 index 0000000000..477378f79b Binary files /dev/null and b/dashboards/jfrog-artifactory-cloud/jfrog-artifactory-cloud02.png differ diff --git a/dashboards/jfrog-artifactory-cloud/jfrog-artifactory-cloud03.png b/dashboards/jfrog-artifactory-cloud/jfrog-artifactory-cloud03.png new file mode 100644 index 0000000000..e8b29ea7ef Binary files /dev/null and b/dashboards/jfrog-artifactory-cloud/jfrog-artifactory-cloud03.png differ diff --git a/dashboards/jfrog-artifactory-cloud/jfrog-artifactory.json b/dashboards/jfrog-artifactory-cloud/jfrog-artifactory.json new file mode 100644 index 0000000000..4c70337bd9 --- /dev/null +++ b/dashboards/jfrog-artifactory-cloud/jfrog-artifactory.json @@ -0,0 +1,878 @@ +{ + "name": "JFrog Platform Cloud", + "description": "This dashboard provides an overview of usage statistics of JFrog Artifactory logs (application, audit, Docker, requests) and overview of the system metrics, JVM statistics, storage consumption, garbage collection, and other operational insights associated with JFrog Artifactory", + "pages": [ + { + "name": "Requests", + "description": null, + "widgets": [ + { + "title": "", + "layout": { + "column": 1, + "row": 1, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "![JFrog Artifactory Logo](data:image/jpeg;base64,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)\n\n---\n#### Dashboard Instructions\n\n(Scroll for more)\n\n---\n##### Variables Available\n* **User**: Filters by user, primarily for auditing actions\n* **Repository**: Filters by repository, used for monitoring docker data\n---\n##### Dashboard Pages\n- **Requests**: Tracks HTTP response codes, and upload/download activity by IP Address\n- **Audit**: Track audit logs to determine who is accessing your Artifactory instance and from where. Service users are filtered out | *Variable: User*\n- **Docker**: Tracks your dockerhub status over time | *Variable: Repository*\n\n" + } + }, + { + "title": "Artifactory calls by HTTP status", + "layout": { + "column": 5, + "row": 1, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Log SELECT count(return_status) FACET return_status WHERE service = 'jfrog.saas.rt.artifactory.request' AND user_name IN ({{user}}) TIMESERIES AUTO " + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Artifactory HTTP 4xx errors", + "layout": { + "column": 9, + "row": 1, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Log SELECT count(return_status) FACET return_status WHERE service = 'jfrog.saas.rt.artifactory.request' AND return_status LIKE '4%%' AND user_name IN ({{user}}) TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "units": { + "unit": "COUNT" + } + } + }, + { + "title": "Top requests by IP address", + "layout": { + "column": 1, + "row": 4, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET ip_address WHERE ip_address !='UNKNOWN' AND ip_address !='127.0.0.1' AND user_name IN ({{user}}) LIMIT 10 " + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Artifactory HTTP 5xx errors", + "layout": { + "column": 5, + "row": 4, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Log SELECT count(return_status) FACET return_status WHERE service = 'jfrog.saas.rt.artifactory.request' AND return_status LIKE '5%%' AND user_name IN ({{user}}) TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "User request activity", + "layout": { + "column": 9, + "row": 4, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET user_name WHERE service LIKE 'jfrog.saas.%' AND request_user_agent NOT LIKE 'Prometheus%' AND user_name NOT LIKE 'jf%@%' AND user_name NOT LIKE 'non_authenticated_user' AND user_name NOT LIKE '_system_' AND user_name NOT IN ('UNKNOWN','NA') AND user_name IN ({{user}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Log volume, number of records", + "layout": { + "column": 1, + "row": 7, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.pie" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": true + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Log SELECT count(service) FACET service WHERE hostname = 'jfrog-cloud' AND service NOT LIKE 'jfrog.saas.rt.xray.%' AND user_name IN ({{user}}) " + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Accessed resources by username, instance name and IP address", + "layout": { + "column": 5, + "row": 7, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log WITH user_name AS user FACET request_url, user_name, remote_address WHERE service = 'jfrog.saas.rt.artifactory.request' AND request_url NOT LIKE '/ui%' AND request_url NOT LIKE '/api/v1/metrics%' AND request_url NOT LIKE '/api/v1/system%' AND request_url NOT LIKE '/api/system%' AND request_url NOT LIKE '/api/admin/%' AND request_url NOT LIKE '/api/storagesummary/%' AND request_url NOT LIKE '/api/xray%' AND request_url NOT LIKE '/api/auth/%' AND request_url NOT LIKE '/api/treebrowser/%' AND request_url NOT LIKE '/api/home/%' AND request_url NOT LIKE '/api/artifact%' AND request_url NOT LIKE '/api/v2/%' AND request_url NOT LIKE '/api/builds%' AND request_url NOT LIKE '/api/docker/%/blobs%' AND request_url NOT LIKE '/api/search%' AND request_url NOT LIKE '/api/storage%' AND request_url NOT LIKE '/api/bundles%' AND request_url NOT LIKE '/api/onboarding%' AND request_url NOT LIKE '/api/users%' AND request_url NOT LIKE '/api/permissiontargets%' AND request_url NOT IN ('/api/repodata','/api/artifactactions/download','/api/setMeUp','/api/treebrowser','/api/generalConfig','/api/propertysets','/api/saml/config','/api/setMeUp','/api/subscription/getUpgradeInfo','/api/generalConfig','/api/global/replications/config','/api/onboarding/initStatus','/api/docker/null/v2/token','/api/docker/v2/') AND user_name IN ({{user}}) LIMIT 10" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + } + ] + }, + { + "name": "Audit", + "description": null, + "widgets": [ + { + "title": "Operations by users", + "layout": { + "column": 1, + "row": 1, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET user_name WHERE service = 'jfrog.saas.rt.access.audit' AND user_name IN ({{user}}) AND user_name NOT LIKE 'jf%@%'" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Operations on tokens", + "layout": { + "column": 5, + "row": 1, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(entity_name) FROM Log FACET entity_name WHERE entity_name LIKE '%@%/%' AND user_name IN ({{user}}) TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Operations on permissions", + "layout": { + "column": 9, + "row": 1, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET event,event_type WHERE service = 'jfrog.saas.rt.access.security.audit' AND entity_name NOT LIKE '%@%' AND event = 'PRM' AND user_name IN ({{user}}) TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Operations on users", + "layout": { + "column": 1, + "row": 4, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET event,event_type,user_name WHERE service = 'jfrog.saas.rt.access.security.audit' AND entity_name NOT LIKE '%@%' AND event = 'USR' AND user_name IN ({{user}}) TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Operations on groups", + "layout": { + "column": 5, + "row": 4, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET event,event_type,user_name WHERE service = 'jfrog.saas.rt.access.security.audit' AND entity_name NOT LIKE '%@%' AND event = 'GRP' AND user_name IN ({{user}}) TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Artifactory access security audit events ", + "layout": { + "column": 9, + "row": 4, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET service WHERE service = 'jfrog.saas.rt.access.security.audit' AND user_name IN ({{user}}) TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Artifactory access audit events ", + "layout": { + "column": 1, + "row": 7, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET service WHERE service = 'jfrog.saas.rt.access.audit' AND user_name IN ({{user}}) TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Action types", + "layout": { + "column": 5, + "row": 7, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET action_response WHERE service = 'jfrog.saas.rt.artifactory.access' AND user_name IN ({{user}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Accepted deploys by username", + "layout": { + "column": 9, + "row": 7, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET action_response, user_name WHERE service = 'jfrog.saas.rt.artifactory.access' AND action_response = 'ACCEPTED DEPLOY' AND user_name IN ({{user}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Denied actions by IP", + "layout": { + "column": 1, + "row": 10, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.pie" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": true + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET ip_address, action WHERE service = 'jfrog.saas.rt.artifactory.access' AND user_name IN ({{user}}) AND action_response LIKE 'DENIED%'" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Denied downloads by username and instance", + "layout": { + "column": 5, + "row": 10, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.pie" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": true + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET user_name,action,instance_name WHERE service = 'jfrog.saas.rt.artifactory.access' AND user_name IN ({{user}}) AND action_response LIKE 'DENIED DOWNLOAD'" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Users activity over time", + "layout": { + "column": 9, + "row": 10, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET user_name WHERE service = 'jfrog.saas.rt.artifactory.access' AND user_name != 'NA' AND user_name IN ({{user}}) TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Denied logins by IP", + "layout": { + "column": 1, + "row": 13, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.pie" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": true + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET action_response,ip_address WHERE service = 'jfrog.saas.rt.artifactory.access' AND action_response LIKE 'DENIED LOGIN' AND user_name IN ({{user}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Accepted deployments by username and instance name.", + "layout": { + "column": 5, + "row": 13, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.pie" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": true + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET action_response,user_name,instance_name WHERE service = 'jfrog.saas.rt.artifactory.access' AND action_response LIKE 'ACCEPTED DEPLOY' AND user_name IN ({{user}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Accepted downloads by username and instance name.", + "layout": { + "column": 9, + "row": 13, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.pie" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": true + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET action_response,user_name,instance_name WHERE service = 'jfrog.saas.rt.artifactory.access' AND action_response LIKE 'ACCEPTED DOWNLOAD' AND user_name IN ({{user}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + } + ] + }, + { + "name": "Docker", + "description": null, + "widgets": [ + { + "title": "Accessed docker repos (timeseries)", + "layout": { + "column": 1, + "row": 1, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Log SELECT count(repo) FACET repo WHERE service = 'jfrog.saas.rt.artifactory.request' AND request_method IN ('HEAD','PUT') AND request_url LIKE '%/manifests/%' AND repo IN ({{repo}}) TIMESERIES AUTO " + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Accessed docker repos (top chart)", + "layout": { + "column": 5, + "row": 1, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET repo WHERE service = 'jfrog.saas.rt.artifactory.request' AND request_method IN ('HEAD','PUT') AND request_url LIKE '%/manifests/%' AND repo IN ({{repo}}) LIMIT 10" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Accessed docker images by name and response code", + "layout": { + "column": 9, + "row": 1, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT count(*) FROM Log FACET return_status,image WHERE service = 'jfrog.saas.rt.artifactory.request' AND request_method IN ('HEAD','PUT') AND request_url LIKE '%/manifests/%' AND repo IN ({{repo}}) TIMESERIES" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Accessed docker images (timeseries)", + "layout": { + "column": 1, + "row": 4, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.stacked-bar" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "FROM Log SELECT count(image) FACET image WHERE service = 'jfrog.saas.rt.artifactory.request' AND request_method IN ('HEAD','PUT') AND request_url LIKE '%/manifests/%' AND repo IN ({{repo}}) TIMESERIES AUTO " + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Data Transfers (GBs) Uploads By Repo", + "layout": { + "column": 5, + "row": 4, + "width": 4, + "height": 3 + }, + "linkedEntityGuids": null, + "visualization": { + "id": "viz.pie" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": true + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountIds": [], + "query": "SELECT sum(response_content_length) FROM Log FACET repo WHERE service = 'jfrog.saas.rt.artifactory.request' AND request_url LIKE '/api/docker/%' AND image!='NULL' AND image!='' AND repo IN ({{repo}})" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + } + ] + } + ], + "variables": [ + { + "name": "user", + "items": null, + "defaultValues": [ + { + "value": { + "string": "*" + } + } + ], + "nrqlQuery": { + "accountIds": [], + "query": "SELECT uniques(user_name) FROM Log WHERE hostname = 'jfrog-cloud' AND user_name NOT LIKE 'token:%' AND user_name != nil " + }, + "options": { + "ignoreTimeRange": false + }, + "title": "User", + "type": "NRQL", + "isMultiSelection": true, + "replacementStrategy": "DEFAULT" + }, + { + "name": "repo", + "items": null, + "defaultValues": [ + { + "value": { + "string": "*" + } + } + ], + "nrqlQuery": { + "accountIds": [], + "query": "SELECT uniques(repo) FROM Log WHERE hostname = 'jfrog-cloud' AND repo != nil " + }, + "options": { + "ignoreTimeRange": false + }, + "title": "Repository", + "type": "NRQL", + "isMultiSelection": true, + "replacementStrategy": "DEFAULT" + } + ] +} \ No newline at end of file diff --git a/dashboards/lambdatest/lambdatest-logs.json b/dashboards/lambdatest/lambdatest-logs.json index 07215cdab0..196c6fb722 100644 --- a/dashboards/lambdatest/lambdatest-logs.json +++ b/dashboards/lambdatest/lambdatest-logs.json @@ -526,7 +526,7 @@ "nrqlQueries": [ { "accountIds": [], - "query": "SELECT uniqueCount(job_id) AS 'Jobs' FROM Log WHERE `service`='lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hypertest' SINCE 1 week ago" + "query": "SELECT uniqueCount(job_id) AS 'Jobs' FROM Log WHERE `service`='lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hye-job' SINCE 1 week ago" } ], "platformOptions": { @@ -553,7 +553,7 @@ "nrqlQueries": [ { "accountIds": [], - "query": "SELECT uniqueCount(task_id) AS 'Tasks' FROM Log WHERE service='lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hypertest' SINCE 1 week ago" + "query": "SELECT uniqueCount(task_id) AS 'Tasks' FROM Log WHERE `service`='lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hye-task' SINCE 1 week ago" } ], "platformOptions": { @@ -580,7 +580,7 @@ "nrqlQueries": [ { "accountIds": [], - "query": "SELECT uniqueCount(stage_id) AS 'Stages' FROM Log WHERE service='lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hypertest' SINCE 1 week ago" + "query": "SELECT uniqueCount(stage_id) AS 'Stages' FROM Log WHERE `service`='lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hye-stage' SINCE 1 week ago" } ], "platformOptions": { @@ -610,7 +610,7 @@ "nrqlQueries": [ { "accountIds": [], - "query": "SELECT uniqueCount(job_id) \nFROM Log \nWHERE `newrelic.source` = 'api.logs'\nAND service = 'lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hypertest' AND job_status NOT IN ('initiated', 'running')\nFACET job_status\nSINCE 1 week ago \nTIMESERIES" + "query": "SELECT uniqueCount(job_id) \nFROM Log \nWHERE `newrelic.source` = 'api.logs'\nAND service = 'lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hye-job'\nFACET job_status\nSINCE 1 week ago \nTIMESERIES" } ], "platformOptions": { @@ -640,7 +640,7 @@ "nrqlQueries": [ { "accountIds": [], - "query": "SELECT uniqueCount(task_id) \nFROM Log \nWHERE `newrelic.source` = 'api.logs'\nAND service = 'lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hypertest' AND task_status NOT IN ('queued', 'initiated', 'running')\nFACET task_status\nSINCE 1 week ago \nTIMESERIES" + "query": "SELECT uniqueCount(task_id) \nFROM Log \nWHERE `newrelic.source` = 'api.logs'\nAND service = 'lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hye-task'\nFACET task_status\nSINCE 1 week ago \nTIMESERIES" } ], "platformOptions": { @@ -670,7 +670,7 @@ "nrqlQueries": [ { "accountIds": [], - "query": "SELECT uniqueCount(stage_id) \nFROM Log \nWHERE `newrelic.source` = 'api.logs'\nAND service = 'lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hypertest' AND status NOT IN ('created', 'in-progress')\nFACET status\nSINCE 1 week ago \nTIMESERIES" + "query": "SELECT uniqueCount(stage_id) \nFROM Log \nWHERE `newrelic.source` = 'api.logs'\nAND service = 'lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hye-stage'\nFACET stage_status\nSINCE 1 week ago \nTIMESERIES" } ], "platformOptions": { @@ -700,7 +700,7 @@ "nrqlQueries": [ { "accountIds": [], - "query": "SELECT percentage(uniqueCount(job_id), WHERE task_status = 'completed') AS 'Completed',\n percentage(uniqueCount(job_id), WHERE task_status = 'failed') AS 'Failed',\n percentage(uniqueCount(job_id), WHERE task_status = 'skipped') AS 'Skipped',\n\t percentage(uniqueCount(job_id), WHERE task_status = 'cancelled') AS 'Cancelled',\n\t percentage(uniqueCount(job_id), WHERE task_status = 'aborted') AS 'Aborted',\n\t percentage(uniqueCount(job_id), WHERE task_status = 'lambda_error') AS 'Lambda error',\n\t percentage(uniqueCount(job_id), WHERE task_status = 'timeout') AS 'Timeout',\n\t percentage(uniqueCount(job_id), WHERE task_status = 'log-available') AS 'Log available'\nFROM Log \nWHERE `newrelic.source` = 'api.logs'\nAND service = 'lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hypertest'\nSINCE 1 week ago \nTIMESERIES" + "query": "SELECT percentage(uniqueCount(task_id), WHERE task_status = 'completed') AS 'Completed',\n percentage(uniqueCount(task_id), WHERE task_status = 'failed') AS 'Failed',\n percentage(uniqueCount(task_id), WHERE task_status = 'skipped') AS 'Skipped',\n\t percentage(uniqueCount(task_id), WHERE task_status = 'cancelled') AS 'Cancelled',\n\t percentage(uniqueCount(task_id), WHERE task_status = 'aborted') AS 'Aborted',\n\t percentage(uniqueCount(task_id), WHERE task_status = 'lambda_error') AS 'Lambda error',\n\t percentage(uniqueCount(task_id), WHERE task_status = 'timeout') AS 'Timeout',\n\t percentage(uniqueCount(task_id), WHERE task_status = 'log-available') AS 'Log available'\nFROM Log \nWHERE `newrelic.source` = 'api.logs'\nAND service = 'lambdatest' AND `newrelic.source` = 'api.logs' AND `logtype` = 'hye-task'\nSINCE 1 week ago \nTIMESERIES" } ], "platformOptions": { diff --git a/data-sources/jfrog-platform-cloud/config.yml b/data-sources/jfrog-platform-cloud/config.yml new file mode 100644 index 0000000000..cc66c57f7c --- /dev/null +++ b/data-sources/jfrog-platform-cloud/config.yml @@ -0,0 +1,8 @@ +id: jfrog-platform-cloud +displayName: JFrog Platform Cloud +description: Observe JFrog Platform Cloud and gain insights using New Relic Observability platform +install: + primary: + link: + url: https://jfrog.com/help/r/jfrog-hosting-models-documentation/jfrog-cloud-log-streaming +icon: icon.svg diff --git a/data-sources/jfrog-platform-cloud/icon.svg b/data-sources/jfrog-platform-cloud/icon.svg new file mode 100644 index 0000000000..3dd38ec59a --- /dev/null +++ b/data-sources/jfrog-platform-cloud/icon.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/quickstarts/jfrog-platform-cloud/config.yml b/quickstarts/jfrog-platform-cloud/config.yml new file mode 100644 index 0000000000..6d1fbb962f --- /dev/null +++ b/quickstarts/jfrog-platform-cloud/config.yml @@ -0,0 +1,45 @@ +slug: jfrog-platform-cloud +title: JFrog Software Supply Chain Cloud Platform +description: | + ## Why monitor the JFrog Platform + + The JFrog Platform is a leading universal end-to-end DevOps and DevSecOps platform for automating, managing, securing, distributing, orchestrating, monitoring, and optimizing your Cl/ CD pipeline. Monitor the JFrog Platform to get real-time insights about the health, performance, and security of your software supply chain. + + ### JFrog Platform quickstart highlights + + The integration surfaces critical platform logs available through pre-built dashboards + + - Monitor the JFrog Cloud instance inside the convenient New Relic observability platform + - Curated dashboards surface performance data, artifact usage for operations teams, DevSecOps teams, and business stakeholders. + + ### Quickstart benefits + - **Faster and more reliable software delivery.** Monitor all your JFrog applications, artifacts, and dependencies in real time with pre-built dashboards. + - **Better compliance and security.** Identify urgent vulnerabilities, identify malicious users, and deliver more secure software with less toil. + - **Improve software supply chain performance.** Proactively manage suspicious activity, remediate issues and boost release velocity and quality. + +summary: | + Monitor your JFrog Artifactory Cloud instance for faster, more secure software delivery +level: Verified +authors: + - JFrog + - Daniel Miakotkin +keywords: + - newrelic + - newrelic partner + - apm + - open source monitoring + - artifactory + - saas + - security + - featured + - NR1_addData +documentation: + - name: JFrog Cloud Log Streaming + url: https://jfrog.com/help/r/jfrog-hosting-models-documentation/jfrog-cloud-log-streaming + description: | + JFrog Cloud Log Streaming integration documentation +icon: icon.svg +dashboards: + - jfrog-artifactory-cloud +dataSourceIds: + - jfrog-platform-cloud diff --git a/quickstarts/jfrog-platform-cloud/icon.svg b/quickstarts/jfrog-platform-cloud/icon.svg new file mode 100644 index 0000000000..3dd38ec59a --- /dev/null +++ b/quickstarts/jfrog-platform-cloud/icon.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + +