-
Notifications
You must be signed in to change notification settings - Fork 1
/
sendmail-dashboard-report.js
132 lines (120 loc) · 4.46 KB
/
sendmail-dashboard-report.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
const got = require("got");
// import got from "got"; // Replace the line above with this to run standalone outside of synthetics
const assert = require("assert");
// import assert from "assert"; // Replace the line above with this to run standalone outside of synthetics
/**
* For local development
*/
if (typeof $env === "undefined" || $env === null) {
var $secure = new Object(); // These secure credentials are expected to be present in the New Relic account
$secure.USER_API_KEY = '<your-new-relic-user-key>';
$secure.SENDER_ADDRESS = '<your-azure-email-address>';
$secure.AZURE_TENANT = '<your-azure-tenant>';
$secure.AZURE_CLIENT_ID = '<your-azure-client-id>';
$secure.AZURE_CLIENT_SECRET = '<your-azure-client-secret>';
}
/** CONFIGURATIONS */
const REGIONS = {
'us': 'https://api.newrelic.com/graphql',
'eu': 'https://api.eu.newrelic.com/graphql'
};
const NERDGRAPH_URL = REGIONS['us'];
const DASHBOARD_GUID = "<your-dashboard-guid>>"; // https://docs.newrelic.com/docs/apis/nerdgraph/examples/export-dashboards-pdfpng-using-api/#dash-multiple
const DASHBOARD_URL = '<your-dashboard-page-url>'; // The dashboard page url
const SUBJECT = 'Weekly Report'; // Subject of the email
const RECIPIENTS = [
"<your-first-recipient>",
]; // Email or emails of recipients as array elements, separated by a comma
const SENDER = $secure.SENDER_ADDRESS; // Email you want to appear as the sender
/** END CONFIGURATIONS */
async function getToken() {
try {
let response = await got.post('https://login.microsoftonline.com/' + $secure.AZURE_TENANT + '/oauth2/v2.0/token',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
client_id: $secure.AZURE_CLIENT_ID,
client_secret: $secure.AZURE_CLIENT_SECRET,
grant_type: 'client_credentials',
scope: 'https://graph.microsoft.com/.default'
}
}
)
assert.ok(response.statusCode == 200, "Error response code received during oauth " + response.statusCode);
const responseJson = JSON.parse(response.body);
return responseJson['access_token'];
} catch (error) {
console.error("Error getting token " + error)
}
}
async function getDashboardURL() {
const headers = { 'Content-Type': 'application/json', 'API-Key': $secure.USER_API_KEY };
const query = `mutation {
dashboardCreateSnapshotUrl(guid: "${DASHBOARD_GUID}")
}`;
const options = {
url: NERDGRAPH_URL,
headers: headers,
json: { 'query': query, 'variables': {} }
};
try {
const response = await got.post(options);
if (response.statusCode == 200) {
const payload = JSON.parse(response.body);
var dashboardSnapshotUrl = payload.data.dashboardCreateSnapshotUrl;
dashboardSnapshotUrl = dashboardSnapshotUrl.replace("PDF", "PNG")
}
return dashboardSnapshotUrl;
} catch (error) {
console.error("Error getting dashboard pdf " + error)
}
}
async function sendEmail(token, dashboardSnapshotUrl) {
let toRecipients = [];
for (const recipient of RECIPIENTS) {
toRecipients.push({emailAddress: {address: recipient}})
}
const messagePayload = {
//Ref: https://learn.microsoft.com/en-us/graph/api/resources/message#properties
message: {
subject: SUBJECT,
body: {
contentType: 'HTML',
content: `
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>Weekly Report</h1>
Click <a href="${DASHBOARD_URL}">here</a> to view the dashboard in New Relic<br>
Click <a href="${dashboardSnapshotUrl}">here</a> to see the PNG of this New Relic Dashboard<br><br>
<img src="${dashboardSnapshotUrl}"/></a>
<br>
</body>
`
},
toRecipients: toRecipients
}
};
try {
await got.post({ // Send Email using Microsoft Graph
url: `https://graph.microsoft.com/v1.0/users/${SENDER}/sendMail`,
headers: {
'Authorization': "Bearer " + token,
'Content-Type': 'application/json'
},
json: messagePayload
})
} catch (error) {
console.error("Error sending email " + error)
}
}
async function main() {
const token = await getToken();
const dashboardSnapshotUrl = await getDashboardURL();
await sendEmail(token, dashboardSnapshotUrl);
}
main()