<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic [Unlock Workflow Power] only with one Running.JS scheduled Task in Dynatrace tips</title>
    <link>https://community.dynatrace.com/t5/Dynatrace-tips/Unlock-Workflow-Power-only-with-one-Running-JS-scheduled-Task/m-p/251216#M1316</link>
    <description>&lt;P&gt;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.&lt;/P&gt;&lt;P&gt;Valid and compliant for Dynatrace SaaS platform version 1.296.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;*** client context&amp;nbsp;&lt;/P&gt;&lt;P&gt;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!&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;*** WORKAROUND OVERVIEW&lt;BR /&gt;&lt;BR /&gt;Before sharing my "only one Task JS" please find main lines of my running.JS :&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;1 .&amp;nbsp; // Retrieve credentials from the credential vault for External API&lt;BR /&gt;&amp;nbsp; &amp;nbsp;2.&amp;nbsp;&amp;nbsp;// fetching bearer Token value&lt;BR /&gt;&amp;nbsp; &amp;nbsp;3.&amp;nbsp;&amp;nbsp;// collect APIs parameters from external endpoints&lt;BR /&gt;&amp;nbsp; &amp;nbsp;4 . // ingest metric to Dynatrace&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Find my script lightened but with the important steps, all-in-one running.JS task as depicted below :&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;DIV&gt;&lt;TABLE border="1" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="100%"&gt;&lt;DIV&gt;import { credentialVaultClient } from "@dynatrace-sdk/client-classic-environment-v2";&lt;/DIV&gt;&lt;DIV&gt;import { executionsClient } from '@dynatrace-sdk/client-automation';&lt;/DIV&gt;&lt;DIV&gt;import { execution } from '@dynatrace-sdk/automation-utils';&lt;/DIV&gt;&lt;DIV&gt;import { metricsClient } from "@dynatrace-sdk/client-classic-environment-v2";&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;STRONG&gt;// Main()&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;export default async function ({ execution_id }) { &lt;STRONG&gt;==&amp;gt;&amp;nbsp; Main function&amp;nbsp;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; try {&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; // Retrieve credentials from the credential vault for External endpoint API&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const External endpointCredentials = await credentialVaultClient.getCredentialsDetails(&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; { id: "CREDENTIALS_VAULT-XXX" }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; );&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const External endpointUsername = External endpointCredentials.username;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const External endpointPassword = External endpointCredentials.password;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (!External endpointUsername || !External endpointPassword) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; throw new Error('External endpoint credentials are not defined.');&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;// fetching bearer Token value&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; async function fetchBearerToken() { &lt;STRONG&gt;==&amp;gt; function 1 : getToken from External endpoint&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const response = await fetch('&lt;A href="https://api.External" target="_blank"&gt;https://api.External&lt;/A&gt; endpoint.XXX/auth/login', {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; method: 'POST',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; body: JSON.stringify({ email: External endpointUsername, password: External endpointPassword }),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; headers: {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'Content-Type': 'application/json',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'Accept': 'application/json',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Parse response body as JSON&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;// collect APIs parameters from External endpoint&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; async function fetchData(bearerToken) { &lt;STRONG&gt;==&amp;gt; function 2 : get parameters/data from External endpoint (i.e. scenarioName)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; console.log('Bearer Token:', bearerToken);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;// make dates dynamic&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;function formatDate(date) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;var d = new Date(date),&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; month = '' + (d.getMonth() + 1),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; day = '' + d.getDate(),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; year = d.getFullYear();&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (month.length &amp;lt; 2)&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; month = '0' + month;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (day.length &amp;lt; 2)&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; day = '0' + day;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return [year, month, day].join('-');&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;};&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;var today = new Date();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;var firstDay = new Date(today.getFullYear(),today.getMonth()-1,1);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;firstDay.setDate(Math.min(today.getDate(),firstDay.getDate()));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;var lastDay = formatDate(new Date(today.getFullYear(),today.getMonth(),0))+ ' 00:00:00';&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;firstDay=formatDate(firstDay.getFullYear()+'-'+(firstDay.getMonth()+1)+'-'+firstDay.getDate())+ ' 00:00:00';&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;console.log(firstDay);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;console.log(lastDay);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const body = {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "dates": {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "from": firstDay,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "to": lastDay&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Define the endpoint to fetch data from&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const apiEndpoint = '&lt;A href="https://api.External" target="_blank"&gt;https://api.External&lt;/A&gt; endpoint.XXX.net/results/avail/XXX'; &lt;STRONG&gt;// Replace with the actual endpoint&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Try to parse response as JSON if needed&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; // Fetch bearer token and data&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const bearerToken = await fetchBearerToken();&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const scenarioData = await fetchData(bearerToken);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; // Assuming the scenarioData contains the relevant fields directly&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const get_scenario_name = scenarioData.scenarioName;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const get_scenario_rate = scenarioData.ratePercent;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; // Send the metrics to Dynatrace ==&amp;gt;&amp;nbsp; Ingest metrics via Dynatrace API&amp;nbsp;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const environment = "/platform/classic/environment-api/v2/metrics/ingest";&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; try {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; const response = await fetch(environment, {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; method: 'POST',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; headers: {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'Content-Type': 'text/plain; charset=utf-8',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; body: `External endpoint.availability.rate,scenario.name=${get_scenario_name} ${get_scenario_rate}`,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // Try to parse response as JSON if needed&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; } catch (error) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; console.error('Error in script execution:', error);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; throw error;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;I hope it helps,&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Mon, 22 Jul 2024 14:39:45 GMT</pubDate>
    <dc:creator>uros_djukic1</dc:creator>
    <dc:date>2024-07-22T14:39:45Z</dc:date>
    <item>
      <title>[Unlock Workflow Power] only with one Running.JS scheduled Task</title>
      <link>https://community.dynatrace.com/t5/Dynatrace-tips/Unlock-Workflow-Power-only-with-one-Running-JS-scheduled-Task/m-p/251216#M1316</link>
      <description>&lt;P&gt;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.&lt;/P&gt;&lt;P&gt;Valid and compliant for Dynatrace SaaS platform version 1.296.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;*** client context&amp;nbsp;&lt;/P&gt;&lt;P&gt;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!&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;*** WORKAROUND OVERVIEW&lt;BR /&gt;&lt;BR /&gt;Before sharing my "only one Task JS" please find main lines of my running.JS :&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;1 .&amp;nbsp; // Retrieve credentials from the credential vault for External API&lt;BR /&gt;&amp;nbsp; &amp;nbsp;2.&amp;nbsp;&amp;nbsp;// fetching bearer Token value&lt;BR /&gt;&amp;nbsp; &amp;nbsp;3.&amp;nbsp;&amp;nbsp;// collect APIs parameters from external endpoints&lt;BR /&gt;&amp;nbsp; &amp;nbsp;4 . // ingest metric to Dynatrace&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Find my script lightened but with the important steps, all-in-one running.JS task as depicted below :&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;DIV&gt;&lt;TABLE border="1" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="100%"&gt;&lt;DIV&gt;import { credentialVaultClient } from "@dynatrace-sdk/client-classic-environment-v2";&lt;/DIV&gt;&lt;DIV&gt;import { executionsClient } from '@dynatrace-sdk/client-automation';&lt;/DIV&gt;&lt;DIV&gt;import { execution } from '@dynatrace-sdk/automation-utils';&lt;/DIV&gt;&lt;DIV&gt;import { metricsClient } from "@dynatrace-sdk/client-classic-environment-v2";&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;STRONG&gt;// Main()&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;export default async function ({ execution_id }) { &lt;STRONG&gt;==&amp;gt;&amp;nbsp; Main function&amp;nbsp;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; try {&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; // Retrieve credentials from the credential vault for External endpoint API&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const External endpointCredentials = await credentialVaultClient.getCredentialsDetails(&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; { id: "CREDENTIALS_VAULT-XXX" }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; );&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const External endpointUsername = External endpointCredentials.username;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const External endpointPassword = External endpointCredentials.password;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (!External endpointUsername || !External endpointPassword) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; throw new Error('External endpoint credentials are not defined.');&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;// fetching bearer Token value&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; async function fetchBearerToken() { &lt;STRONG&gt;==&amp;gt; function 1 : getToken from External endpoint&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const response = await fetch('&lt;A href="https://api.External" target="_blank"&gt;https://api.External&lt;/A&gt; endpoint.XXX/auth/login', {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; method: 'POST',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; body: JSON.stringify({ email: External endpointUsername, password: External endpointPassword }),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; headers: {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'Content-Type': 'application/json',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'Accept': 'application/json',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Parse response body as JSON&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;// collect APIs parameters from External endpoint&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; async function fetchData(bearerToken) { &lt;STRONG&gt;==&amp;gt; function 2 : get parameters/data from External endpoint (i.e. scenarioName)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; console.log('Bearer Token:', bearerToken);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;// make dates dynamic&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;function formatDate(date) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;var d = new Date(date),&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; month = '' + (d.getMonth() + 1),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; day = '' + d.getDate(),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; year = d.getFullYear();&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (month.length &amp;lt; 2)&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; month = '0' + month;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (day.length &amp;lt; 2)&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; day = '0' + day;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return [year, month, day].join('-');&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;};&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;var today = new Date();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;var firstDay = new Date(today.getFullYear(),today.getMonth()-1,1);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;firstDay.setDate(Math.min(today.getDate(),firstDay.getDate()));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;var lastDay = formatDate(new Date(today.getFullYear(),today.getMonth(),0))+ ' 00:00:00';&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;firstDay=formatDate(firstDay.getFullYear()+'-'+(firstDay.getMonth()+1)+'-'+firstDay.getDate())+ ' 00:00:00';&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;console.log(firstDay);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;console.log(lastDay);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const body = {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "dates": {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "from": firstDay,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "to": lastDay&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Define the endpoint to fetch data from&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const apiEndpoint = '&lt;A href="https://api.External" target="_blank"&gt;https://api.External&lt;/A&gt; endpoint.XXX.net/results/avail/XXX'; &lt;STRONG&gt;// Replace with the actual endpoint&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Try to parse response as JSON if needed&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; // Fetch bearer token and data&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const bearerToken = await fetchBearerToken();&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const scenarioData = await fetchData(bearerToken);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; // Assuming the scenarioData contains the relevant fields directly&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const get_scenario_name = scenarioData.scenarioName;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const get_scenario_rate = scenarioData.ratePercent;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; // Send the metrics to Dynatrace ==&amp;gt;&amp;nbsp; Ingest metrics via Dynatrace API&amp;nbsp;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const environment = "/platform/classic/environment-api/v2/metrics/ingest";&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; try {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; const response = await fetch(environment, {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; method: 'POST',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; headers: {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'Content-Type': 'text/plain; charset=utf-8',&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; body: `External endpoint.availability.rate,scenario.name=${get_scenario_name} ${get_scenario_rate}`,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // Try to parse response as JSON if needed&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; } catch (error) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; console.error('Error in script execution:', error);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; throw error;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; }&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;I hope it helps,&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 22 Jul 2024 14:39:45 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Dynatrace-tips/Unlock-Workflow-Power-only-with-one-Running-JS-scheduled-Task/m-p/251216#M1316</guid>
      <dc:creator>uros_djukic1</dc:creator>
      <dc:date>2024-07-22T14:39:45Z</dc:date>
    </item>
  </channel>
</rss>

