Thanks for attending todays webinar by Simon (@0x12b) and Gary (@gspncr). If you have questions you can use the k6 community or the New Relic Explorers Hub and tag us.
Here are some of the assets we presented or mean to distribute:
Thanks for attending todays webinar by Simon (@0x12b) and Gary (@gspncr). If you have questions you can use the k6 community or the New Relic Explorers Hub and tag us.
Here are some of the assets we presented or mean to distribute:
| import http from 'k6/http'; | |
| export class NewRel { | |
| constructor(apiKey, log = false) { | |
| this.log = log; | |
| this.params = { | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| 'API-Key': apiKey, | |
| }, | |
| }; | |
| this.urls = { | |
| graphql: 'https://api.newrelic.com/graphql', | |
| }; | |
| } | |
| PrintAlertingStatus() { | |
| let payload = JSON.stringify({ | |
| query: ` | |
| { | |
| actor { | |
| entitySearch(query: "name LIKE 'Node Workshop' AND domain IN ('APM')") { | |
| results { | |
| entities { | |
| ... on ApmApplicationEntityOutline { | |
| alertSeverity | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| `, | |
| }); | |
| let res = http.post(this.urls.graphql, payload, this.params); | |
| if (this.log) { | |
| console.log('New Relic Check HTTP Status is: ' + res.status); | |
| } | |
| if (res.status === 200) { | |
| let body = JSON.parse(res.body); | |
| var result = body.data.actor.entitySearch.results.entities[0].alertSeverity; | |
| console.log('New Relic Status: ' + result); | |
| } | |
| } | |
| AppID() { | |
| // From NerdGraph, copy the GraphQL payload from tools > copy as cURL > take the entire {"query"} section | |
| let payload = JSON.stringify({ | |
| query: ` | |
| { | |
| actor { | |
| entitySearch(query: "name LIKE 'Node Workshop' AND domain IN ('APM')") { | |
| results { | |
| entities { | |
| ... on ApmApplicationEntityOutline { | |
| applicationId | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| ` | |
| }); | |
| let res = http.post(this.urls.graphql, payload, this.params); | |
| // Check we are not experiencing HTTP 400. If you are, the payload is likely wrong. | |
| if (this.log) { | |
| console.log('New Relic Check HTTP Status is: ' + res.status); | |
| } | |
| if (res.status === 200) { | |
| let body = JSON.parse(res.body); | |
| /* result will depend on the query. This query is built on alertSeverity result. | |
| You need to modify the selector if you are performing a different query */ | |
| var result = JSON.stringify( | |
| body.data.actor.entitySearch.results.entities[0].applicationId | |
| ); | |
| } else { | |
| throw new Error('Could not fetch AppID from New Relic') | |
| } | |
| return result; | |
| } | |
| //Send a deployment marker with start/end information on load test. | |
| Notify(testName, state, description, user) { | |
| var url = | |
| 'https://api.newrelic.com/v2/applications/' + this.AppID() + '/deployments.json'; | |
| console.log(url); | |
| // From NerdGraph, copy the GraphQL payload from tools > copy as cURL > take the entire {"query"} section | |
| let payload = JSON.stringify({ | |
| deployment: { | |
| revision: testName, | |
| changelog: 'k6 load test ' + state, | |
| description: description, | |
| user: user, | |
| }, | |
| }); | |
| let res = http.post(url, payload, this.params); | |
| // Check we are not experiencing HTTP 400. If you are, the payload is likely wrong. | |
| if (![200, 201].includes(res.status)) { | |
| throw new Error(`Could not notify New Relic about test state (res: ${res.status})`) | |
| } | |
| return JSON.stringify(res.status); | |
| } | |
| } | 
| import { check, sleep } from 'k6'; | |
| import { NewRel } from './util/newrelic.js' | |
| import http from 'k6/http'; | |
| const apiKey = '<New Relic API Key>' | |
| const nr = new NewRel(apiKey); | |
| export const options = { | |
| vus: 10, | |
| duration: '10s', | |
| tags: { | |
| testName: 'Tuesdays are for testing', | |
| user: '[email protected]' | |
| } | |
| } | |
| export function setup() { | |
| nr.PrintAlertingStatus(); | |
| nr.Notify( | |
| 'Sunday load test - short', | |
| 'START', | |
| 'Beginning E2E load test script', | |
| '[email protected]', | |
| ); | |
| } | |
| export default function () { | |
| execFrontPage(); | |
| execMathUrl('http://nodeworkshop.eu-west-2.elasticbeanstalk.com/badmaths') | |
| execMathUrl('http://nodeworkshop.eu-west-2.elasticbeanstalk.com/maths') | |
| execMathUrl('http://nodeworkshop.eu-west-2.elasticbeanstalk.com/weirdmaths'); | |
| sleep(1); | |
| } | |
| function execFrontPage() { | |
| const res = http.get( | |
| 'http://nodeworkshop.eu-west-2.elasticbeanstalk.com', | |
| { type: 'part-of-test' }, | |
| ); | |
| check(res, { | |
| 'was succesful': (r) => r.status == 200, | |
| 'contains the header': (r) => r.body.includes('New Relic Node Workshop') | |
| }) | |
| } | |
| function execMathUrl(url) { | |
| const res = http.get(url, { type: 'part-of-test' }); | |
| return check(res, { | |
| 'was succesful': (r) => r.status === 200, | |
| 'has body': (r) => r.body && r.body != '', | |
| 'returns 10': (r) => parseInt(JSON.parse(r.body).x, 10) === 10 | |
| }) | |
| } | |
| export function teardown(data) { | |
| nr.Notify( | |
| 'Sunday load test - short', | |
| 'END', | |
| 'Finishing E2E load test script', | |
| '[email protected]' | |
| ); | |
| nr.PrintAlertingStatus(); | |
| } |