22 Jul 2024 03:39 PM
In our customer context, we used the Workflow to collect the availability rate on a specific scenario in a solution composed of external APIs. In order to feed the main dashboard of availability of "critical" applications. Thus meeting a functional need.
Valid and compliant for Dynatrace SaaS platform version 1.296.
*** client context
Formerly we had to use a Python script and implement a V1 extension, here the simple use of the Workflow with a little knowledge via Javascript makes our work easier!
*** WORKAROUND OVERVIEW
Before sharing my "only one Task JS" please find main lines of my running.JS :
1 . // Retrieve credentials from the credential vault for External API
2. // fetching bearer Token value
3. // collect APIs parameters from external endpoints
4 . // ingest metric to Dynatrace
Find my script lightened but with the important steps, all-in-one running.JS task as depicted below :
import { credentialVaultClient } from "@dynatrace-sdk/client-classic-environment-v2"; import { executionsClient } from '@dynatrace-sdk/client-automation'; import { execution } from '@dynatrace-sdk/automation-utils'; import { metricsClient } from "@dynatrace-sdk/client-classic-environment-v2"; // Main() export default async function ({ execution_id }) { ==> Main function try { // Retrieve credentials from the credential vault for External endpoint API const External endpointCredentials = await credentialVaultClient.getCredentialsDetails( { id: "CREDENTIALS_VAULT-XXX" } ); const External endpointUsername = External endpointCredentials.username; const External endpointPassword = External endpointCredentials.password; if (!External endpointUsername || !External endpointPassword) { throw new Error('External endpoint credentials are not defined.'); } // fetching bearer Token value async function fetchBearerToken() { ==> function 1 : getToken from External endpoint try { const response = await fetch('https://api.External endpoint.XXX/auth/login', { method: 'POST', body: JSON.stringify({ email: External endpointUsername, password: External endpointPassword }), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, }); // Parse response body as JSON } // collect APIs parameters from External endpoint async function fetchData(bearerToken) { ==> function 2 : get parameters/data from External endpoint (i.e. scenarioName) try { console.log('Bearer Token:', bearerToken); // make dates dynamic function formatDate(date) { var d = new Date(date), month = '' + (d.getMonth() + 1), day = '' + d.getDate(), year = d.getFullYear(); if (month.length < 2) month = '0' + month; if (day.length < 2) day = '0' + day; return [year, month, day].join('-'); }; var today = new Date(); var firstDay = new Date(today.getFullYear(),today.getMonth()-1,1); firstDay.setDate(Math.min(today.getDate(),firstDay.getDate())); var lastDay = formatDate(new Date(today.getFullYear(),today.getMonth(),0))+ ' 00:00:00'; firstDay=formatDate(firstDay.getFullYear()+'-'+(firstDay.getMonth()+1)+'-'+firstDay.getDate())+ ' 00:00:00'; console.log(firstDay); console.log(lastDay); const body = { "dates": { "from": firstDay, "to": lastDay } }; // Define the endpoint to fetch data from const apiEndpoint = 'https://api.External endpoint.XXX.net/results/avail/XXX'; // Replace with the actual endpoint // Try to parse response as JSON if needed } // Fetch bearer token and data const bearerToken = await fetchBearerToken(); const scenarioData = await fetchData(bearerToken); // Assuming the scenarioData contains the relevant fields directly const get_scenario_name = scenarioData.scenarioName; const get_scenario_rate = scenarioData.ratePercent; // Send the metrics to Dynatrace ==> Ingest metrics via Dynatrace API const environment = "/platform/classic/environment-api/v2/metrics/ingest"; try { const response = await fetch(environment, { method: 'POST', headers: { 'Content-Type': 'text/plain; charset=utf-8', }, body: `External endpoint.availability.rate,scenario.name=${get_scenario_name} ${get_scenario_rate}`, }); // Try to parse response as JSON if needed } catch (error) { console.error('Error in script execution:', error); throw error; } |
I hope it helps,
Thanks