/nr-synthetics-plugin

Query New Relic Synthetics and publish new metrics as Plugin

Primary LanguageJavaScript

New Relic Synthetics Plugin

Build Status

This plugin runs queries against New Relic Insights to calculate things like % of locations with a failure. It works by querying Insights every 30 seconds, calculating the new metrics (like % of failing locations) and publishing the results as Plugin metrics.

Installation and Setup

There are currently 3 options for running this plugin:

  • Run the plugin directly through NodeJS
  • Run the plugin as a Docker container
  • Run the plugin inside K8S

Setup and Run Directly

Here are the steps to get set up with this plugin:

  • Pre-requisite is NodeJS (7.10 or newer) and npm
  • Clone or download this repository
  • Once in the directory run npm install
  • Setup your configuration for a single account

Once you are all set up you can run the plugin with npm start

Setup and Run as Docker Container

Thanks to @ntkach there are now some Docker files. Here's how you run through Docker.

  • Pre-requisite is NodeJS (8 or newer) and npm
  • Clone or download this repository
  • Once in the directory run npm install
  • Create the ENV variables (see the 4 required variables below)
  • Build the container with something such as: docker build -t nr-synthetics-plugin .
  • Run the container detatched with the compose file: docker-compose up -d

Setup and Run inside K8S

Here's how you run through K8S.

  • Clone or download this repository
  • Copy config/default.json to config/production.json
  • Put in the required license keys in the config
  • Build the container like docker build -t kenahrens/nr-synthetics-plugin:2.2.2 . and publish to your K8S repository
  • Run the deployment with kubectl apply -f k8s/plugin-deployment.yaml

Metrics Included

For every monitor that has reported data, this plugin currently will calculate and publish the following metrics:

  • Component/Location/{locationName}/Success[pct]
  • Component/Location/{locationName}/Failure[pct]
  • Component/Location/{locationName}/Duration[ms]
  • Component/Overall/Success[pct]
  • Component/Overall/Success[count]
  • Component/Overall/Failure[pct]
  • Component/Overall/Failure[count]
  • Component/Overall/Duration[ms]

Configure for a Single Account

There is a config file default.json which defines the required keys. You have 2 options for how to configure the keys:

  • Config File: Copy default.json and create your own config file
  • Environment Variables: Set environment variables

Single Account: Config file

Copy default.json and make your own file like ken-config.json. At runtime you must define an environment variable NODE_ENV and set to the name of your file (do not include the extension).

kahrens@envy5:~/dev/node/nr-synthetics-plugin$ ls -al config/
total 20
drwxrwxr-x 2 kahrens kahrens 4096 Mar 27 10:41 .
drwxrwxr-x 7 kahrens kahrens 4096 Jun 26 15:28 ..
-rw-rw-r-- 1 kahrens kahrens  359 Mar 27 10:41 ahrens.json
-rw-rw-r-- 1 kahrens kahrens  214 Mar 27 10:15 custom-environment-variables.json
-rw-rw-r-- 1 kahrens kahrens  226 Mar 27 10:15 default.json
kahrens@envy5:~/dev/node/nr-synthetics-plugin$ export NODE_ENV=ahrens

Donor and Recipient Account setup

To setup a different event source (donor) and target (recipient) account Insights events, that is pulling Synthetics events and then publishing plugin metrics to a different account. Set and add the following optional properties to your default.json file.

{
    "licenseKey": "<Recipient account license key>"
    "target":{
       "accountId": "<Recipient   account ID>",    
       "insightsInsertKey": "<Recipient Insights Insert key>",
       "insightsQueryKey":"<Recipient Insights Query key>"
     }

}


Sample JSON:

{
  "guid": "com.adg.synthetics.monitor.Synthetics",
  "duration": 30,
  "licenseKey": "888111-1112222333444555666",
  "configArr": [
    "newrelic"
  ],
  "newrelic": {
    "accountId": "12345",
    "insightsQueryKey": "12345-QueryKey",
    "insightsInsertKey": "12345-InsertKey",
  
    "restAPIAdminKey":"12345-restAPIAdminkey"


    "target":{
      "accountId": "888111",
      "insightsQueryKey":"888111-QueryKey",
      "insightsInsertKey": "888111-InsertKey"
    }
  }
}

Monitor retrieval using REST API

For accounts with 1,000+ Synthetics monitors, use the Synthetics REST API to retrieve the monitors.
Set the value to the account owner/admin user API Key

{
    "restAPIAdminKey": "Source REST API Admin key"
}

Sample JSON

Extract Synthetics events from source/donor account and publish Plugin metrics and Plugin custom Insights events to a recipient account.


{
  "guid": "com.adg.synthetics.monitor.Synthetics",
  "duration": 30,
  "licenseKey": "888111-1112222333444555666",   <-- publish Plugin metrics to recipient account
  "configArr": [
    "newrelic"
  ],
  "newrelic": {
    "accountId": "12345",
    "insightsQueryKey": "12345-QueryKey",
    "insightsInsertKey": "12345-InsertKey",
  
    "restAPIAdminKey":"12345-restAPIAdminkey",  <-- read from source account 12345


    "target":{
      "accountId": "888111",
      "insightsQueryKey":"888111-QueryKey",     <-- query Insights events from recipient account
      "insightsInsertKey": "888111-InsertKey"   <-- publish custom Insights events to recipient account
    }
    

  }
}

Single Account: Environment Variables

If you want to query metrics from a single account and post to the same account, you can just set these 3 environment variables:

  • NEWRELIC_LICENSE_KEY maps to licenseKey (for plugin to publish metrics)
  • NEWRELIC_ACCOUNT_ID maps to accountId
  • NEWRELIC_INSIGHTS_QUERY_KEY maps to insightsQueryKey (for plugin to query metrics)
  • NEWRELIC_INSIGHTS_INSERT_KEY maps to insightsInsertKey (for plugin to publish events)

Running the Plugin Directly

You can run the plugin directly like so. Note that it picked up my NODE_ENV that I set earlier to ahrens.

kahrens@envy5:~/dev/node/nr-synthetics-plugin$ npm start

> nr-synthetics-plugin@2.1.1 start /home/kahrens/dev/node/nr-synthetics-plugin
> node index.js

Thu, 20 Jul 2017 14:27:33 GMT - info: Synthetics Plugin version: 2.1.1 started:
Thu, 20 Jul 2017 14:27:33 GMT - info: * GUID: com.adg.synthetics.monitor.Synthetics
Thu, 20 Jul 2017 14:27:33 GMT - info: * Frequency is every 30s, cron: (*/30 * * * * *)
Thu, 20 Jul 2017 14:27:33 GMT - info: * Running as a single config.
Thu, 20 Jul 2017 14:28:00 GMT - info: Starting poll cycle with NODE_ENV Environment: ahrens
Thu, 20 Jul 2017 14:28:00 GMT - info: - Query by location: (14) locations < (55) monitors
Thu, 20 Jul 2017 14:28:01 GMT - info: - There are: 55 monitors
Thu, 20 Jul 2017 14:28:01 GMT - info: - Processing complete for : 55 monitors

Running the Plugin with Forever

Or you can use forever to launch the plugin (and re-launch if it crashes):

kahrens:nr-synthetics-plugin kahrens$ ./node_modules/forever/bin/forever start index.js 
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: index.js

This is how you get a list of all your forever processes:

kahrens:nr-synthetics-plugin kahrens$ ./node_modules/forever/bin/forever list
info:    Forever processes running
data:        uid  command             script   forever pid   id logfile                          uptime      
data:    [0] UKn_ /usr/local/bin/node index.js 70782   70783    /Users/kahrens/.forever/UKn_.log 0:0:0:8.935 

And this is how you get the log:

kahrens:nr-synthetics-plugin kahrens$ ./node_modules/forever/bin/forever logs 0
data:    index.js:71019 - Mon, 22 Aug 2016 12:45:59 GMT - info: Synthetics Plugin started
data:    index.js:71019 - Mon, 22 Aug 2016 12:46:00 GMT - info: Starting poll cycle with env: multi
data:    index.js:71019 - Mon, 22 Aug 2016 12:46:00 GMT - info: getMonitorList for: Ahrens Design Group
data:    index.js:71019 - Mon, 22 Aug 2016 12:46:00 GMT - info: getMonitorList for: Demotron

This is how you stop your plugin, then run list to see it's no longer running.

kahrens:nr-synthetics-plugin kahrens$ ./node_modules/forever/bin/forever stop index.js 
info:    Forever stopped process:
    uid  command             script   forever pid   id logfile                          uptime      
[0] UKn_ /usr/local/bin/node index.js 70782   70783    /Users/kahrens/.forever/UKn_.log 0:0:8:0.212 

Running the Tests

The tests work if you're using a single account and will make sure your node environment is setup properly. All you have to do to run them is:

kahrens:nr-synthetics-plugin kahrens$ npm test

> nr-synthetics-plugin@1.0.0 test /Users/kahrens/Documents/github/nr-synthetics-plugin
> mocha



  New Relic Insights API Test
    ✓ calls the query api (271ms)

  New Relic Plugin Make Metric Test
    ✓ makes a full metric name
    ✓ makes the complete metric JSON


  3 passing (283ms)