<?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 How to create a workflow to ingest Apigee proxy metadata JSON logs as BizEvents and store them in Grail in Automations</title>
    <link>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298724#M2561</link>
    <description>&lt;P&gt;&lt;SPAN&gt;Hello Community,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I’m working on a use case where I need to:&lt;/SPAN&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Ingest JSON logs containing &lt;STRONG&gt;Apigee proxy metadata&lt;/STRONG&gt; (e.g., proxy name, revision, environment, target server, etc.).&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Transform this JSON into &lt;STRONG&gt;BizEvents&lt;/STRONG&gt; inside a Dynatrace Workflow.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Save these BizEvents into &lt;STRONG&gt;Grail&lt;/STRONG&gt; for further analysis and visualization.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;SPAN&gt;My questions are:&lt;/SPAN&gt;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;What is the recommended way to set up a &lt;STRONG&gt;Dynatrace Workflow&lt;/STRONG&gt; that takes JSON input and maps it into BizEvents?&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Can I use the built-in &lt;STRONG&gt;“Ingest BizEvents” action&lt;/STRONG&gt; directly, or should I first transform the JSON using a &lt;STRONG&gt;JavaScript step&lt;/STRONG&gt; before ingestion?&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;What fields are required in the BizEvents JSON (e.g., eventType, timestamp, properties) to ensure successful ingestion into Grail?&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Are there any best practices or examples for handling &lt;STRONG&gt;Apigee proxy metadata&lt;/STRONG&gt; specifically in this workflow?&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;SPAN&gt;Any guidance, examples, or references would be greatly appreciated.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Thanks in advance!&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Thu, 30 Apr 2026 08:02:13 GMT</pubDate>
    <dc:creator>tmehta3</dc:creator>
    <dc:date>2026-04-30T08:02:13Z</dc:date>
    <item>
      <title>How to create a workflow to ingest Apigee proxy metadata JSON logs as BizEvents and store them in Grail</title>
      <link>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298724#M2561</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Hello Community,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I’m working on a use case where I need to:&lt;/SPAN&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Ingest JSON logs containing &lt;STRONG&gt;Apigee proxy metadata&lt;/STRONG&gt; (e.g., proxy name, revision, environment, target server, etc.).&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Transform this JSON into &lt;STRONG&gt;BizEvents&lt;/STRONG&gt; inside a Dynatrace Workflow.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Save these BizEvents into &lt;STRONG&gt;Grail&lt;/STRONG&gt; for further analysis and visualization.&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;SPAN&gt;My questions are:&lt;/SPAN&gt;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;What is the recommended way to set up a &lt;STRONG&gt;Dynatrace Workflow&lt;/STRONG&gt; that takes JSON input and maps it into BizEvents?&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Can I use the built-in &lt;STRONG&gt;“Ingest BizEvents” action&lt;/STRONG&gt; directly, or should I first transform the JSON using a &lt;STRONG&gt;JavaScript step&lt;/STRONG&gt; before ingestion?&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;What fields are required in the BizEvents JSON (e.g., eventType, timestamp, properties) to ensure successful ingestion into Grail?&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;SPAN&gt;Are there any best practices or examples for handling &lt;STRONG&gt;Apigee proxy metadata&lt;/STRONG&gt; specifically in this workflow?&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;SPAN&gt;Any guidance, examples, or references would be greatly appreciated.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Thanks in advance!&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Apr 2026 08:02:13 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298724#M2561</guid>
      <dc:creator>tmehta3</dc:creator>
      <dc:date>2026-04-30T08:02:13Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a workflow to ingest Apigee proxy metadata JSON logs as BizEvents and store them in Grail</title>
      <link>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298725#M2562</link>
      <description>&lt;P&gt;Hello&amp;nbsp;&lt;a href="https://community.dynatrace.com/t5/user/viewprofilepage/user-id/96104"&gt;@tmehta3&lt;/a&gt;,&lt;/P&gt;&lt;P&gt;Yes, you can do this with the built-in Ingest business event action. The recommended approach is:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Use an HTTP Request, trigger payload, or previous workflow step to retrieve the Apigee JSON.&lt;/LI&gt;&lt;LI&gt;If the JSON is already flat and contains the fields you want, pass it directly to Ingest business event.&lt;/LI&gt;&lt;LI&gt;If the JSON is nested, inconsistent, or needs enrichment, add a Run JavaScript step first.&lt;/LI&gt;&lt;LI&gt;Return an array of normalized objects from JavaScript.&lt;/LI&gt;&lt;LI&gt;Use {{ result("your_js_step") | to_json }} in the BizEvent ingestion step.&lt;/LI&gt;&lt;LI&gt;Query the data from Grail with fetch bizevents.&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;For Apigee proxy metadata, I would strongly recommend a small JavaScript normalization step. It gives you a stable schema, avoids nested JSON problems, and makes later DQL queries much easier. Use &lt;STRONG&gt;event.type =&lt;/STRONG&gt; &lt;STRONG&gt;"apigee.proxy.metadata"&lt;/STRONG&gt; and &lt;STRONG&gt;event.provider = "apigee"&lt;/STRONG&gt; as stable identifiers, then keep proxy name, revision, environment, target server, and deployment state as top-level fields.&lt;/P&gt;&lt;P&gt;I hope it points to the right path&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:"&gt;😊&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Apr 2026 08:16:21 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298725#M2562</guid>
      <dc:creator>MaximilianoML</dc:creator>
      <dc:date>2026-04-30T08:16:21Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a workflow to ingest Apigee proxy metadata JSON logs as BizEvents and store them in Grail</title>
      <link>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298735#M2563</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Thanks for the detailed explanation &lt;a href="https://community.dynatrace.com/t5/user/viewprofilepage/user-id/73851"&gt;@MaximilianoML&lt;/a&gt;&amp;nbsp;— I followed the steps you outlined (HTTP Request → Run JavaScript → Ingest BizEvents). The workflow executes successfully till javascript action, but in the &lt;STRONG&gt;Run JavaScript&lt;/STRONG&gt; step I’m seeing &lt;EM&gt;“No logs available”&lt;/EM&gt; in the execution details also in the http request i am able to generate json data but there also seeing "No logs available"&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Does this indicate that my JavaScript step isn’t returning the normalized objects correctly, or is it expected behavior when no explicit console.log is used? I want to confirm whether the BizEvents are actually being passed downstream to the ingestion step, or if I need to adjust the way I’m returning the array.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Could you clarify how to verify that the BizEvents are being generated and ingested into Grail, especially when the workflow UI shows “No logs available”?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Thanks again for your guidance — I just want to make sure the ingestion pipeline is working end-to-end.&lt;/SPAN&gt;&lt;/P&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;</description>
      <pubDate>Thu, 30 Apr 2026 09:49:34 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298735#M2563</guid>
      <dc:creator>tmehta3</dc:creator>
      <dc:date>2026-04-30T09:49:34Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a workflow to ingest Apigee proxy metadata JSON logs as BizEvents and store them in Grail</title>
      <link>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298736#M2564</link>
      <description>&lt;P&gt;Hello again!&lt;/P&gt;&lt;P&gt;Could you gently share some info of the workflow you built, please?&lt;/P&gt;&lt;P&gt;Like the actual JS code and a big picture of the workflow itself, thanks&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":beaming_face_with_smiling_eyes:"&gt;😁&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Apr 2026 09:53:17 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298736#M2564</guid>
      <dc:creator>MaximilianoML</dc:creator>
      <dc:date>2026-04-30T09:53:17Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a workflow to ingest Apigee proxy metadata JSON logs as BizEvents and store them in Grail</title>
      <link>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298743#M2565</link>
      <description>&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-04-30 at 3.35.19 PM.png" style="width: 999px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/32958i5F8112AA85BBCB56/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screenshot 2026-04-30 at 3.35.19 PM.png" alt="Screenshot 2026-04-30 at 3.35.19 PM.png" /&gt;&lt;/span&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-04-30 at 3.35.58 PM.png" style="width: 999px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/32957iEEE66FFB0E30A41C/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screenshot 2026-04-30 at 3.35.58 PM.png" alt="Screenshot 2026-04-30 at 3.35.58 PM.png" /&gt;&lt;/span&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-04-30 at 3.36.41 PM.png" style="width: 999px;"&gt;&lt;img src="https://community.dynatrace.com/t5/image/serverpage/image-id/32962i2462993F181B3B1A/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screenshot 2026-04-30 at 3.36.41 PM.png" alt="Screenshot 2026-04-30 at 3.36.41 PM.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have attached the image of the workflow and the script I have used and showing "No logs available".&lt;BR /&gt;Can u help me with the same&amp;nbsp;&lt;a href="https://community.dynatrace.com/t5/user/viewprofilepage/user-id/73851"&gt;@MaximilianoML&lt;/a&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Apr 2026 10:11:04 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298743#M2565</guid>
      <dc:creator>tmehta3</dc:creator>
      <dc:date>2026-04-30T10:11:04Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a workflow to ingest Apigee proxy metadata JSON logs as BizEvents and store them in Grail</title>
      <link>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298744#M2566</link>
      <description>&lt;P&gt;Hi, yes! Of course I'll try to help you, always feel free to ask &lt;span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:"&gt;😊&lt;/span&gt;&lt;/P&gt;&lt;P&gt;No logs available in the Workflow execution details does &lt;STRONG&gt;not&lt;/STRONG&gt; automatically mean that the JavaScript action failed or that nothing was returned.&lt;/P&gt;&lt;P&gt;In this case, it usually only means that the action did not write anything to the log output, for example with:&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;console.log(something)
console.error(error_something)&lt;/LI-CODE&gt;&lt;P&gt;The important thing to check is the &lt;STRONG&gt;Result&lt;/STRONG&gt; of the JavaScript task, not only the Logs tab. Dynatrace’s Run JavaScript action can return a custom object or array, and that returned value is available to subsequent workflow tasks. The result can be inspected in the execution details and used by later tasks.&lt;/P&gt;&lt;P&gt;Looking at your JavaScript, the main point is that you are currently returning this structure:&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;return { bizEvents, debug: apis };&lt;/LI-CODE&gt;&lt;P&gt;So your JavaScript result is not the BizEvent array itself. It is an object that contains the array under the bizEvents property.&lt;/P&gt;&lt;P&gt;That means, in the Ingest BizEvents step, you should either reference only that nested array, something like this:&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;{{ result("run_javascript_task_name").bizEvents | to_json }}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;Personally, I would simplify the JavaScript and return the array directly:&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;function transform(input) {
  let body = input.http_request_1?.body;
  let apis;

  try {
    apis = typeof body === "string" ? JSON.parse(body) : body;
  } catch (e) {
    console.error("JSON parse error:", e);
    return [];
  }

  const proxies = apis?.proxies || [];

  const bizEvents = proxies.map(p =&amp;gt; ({
    "event.type": "apigee.proxy.metadata",
    "event.provider": "apigee",
    "event.category": "api-management",

    "source.system": "apigee",
    "apigee.organization": "jlr-ddc1-prod",

    "proxy.name": p.name,
    "proxy.revision": String(p.revision ?? ""),

    "debug.ingestion_test_id": "apigee-test-001"
  }));

  console.log("Generated BizEvent count:", bizEvents.length);
  console.log("First BizEvent:", JSON.stringify(bizEvents[0] ?? {}, null, 2));

  return bizEvents;
}&lt;/LI-CODE&gt;&lt;P&gt;Also, I would recommend using Dynatrace way to event fields such as:&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;"event.type": "apigee.proxy.metadata",
"event.provider": "apigee"&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Let me know if worked and the next step, please&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":winking_face:"&gt;😉&lt;/span&gt;&lt;/P&gt;&lt;P&gt;Also, if it helped you, could you gently give Kudos? I'm aiming to be Member of the Month someday&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":hugging_face:"&gt;🤗&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Apr 2026 10:30:02 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Automations/How-to-create-a-workflow-to-ingest-Apigee-proxy-metadata-JSON/m-p/298744#M2566</guid>
      <dc:creator>MaximilianoML</dc:creator>
      <dc:date>2026-04-30T10:30:02Z</dc:date>
    </item>
  </channel>
</rss>

