Skip to content

[axonius][identity] Add Axonius Identity datastream#16620

Open
muskan-agarwal26 wants to merge 6 commits intoelastic:feature/axonius-0.1.0from
muskan-agarwal26:datastream-identity
Open

[axonius][identity] Add Axonius Identity datastream#16620
muskan-agarwal26 wants to merge 6 commits intoelastic:feature/axonius-0.1.0from
muskan-agarwal26:datastream-identity

Conversation

@muskan-agarwal26
Copy link
Copy Markdown
Contributor

@muskan-agarwal26 muskan-agarwal26 commented Dec 18, 2025

Proposed commit message

The release includes identity data stream and associated dashboard.

Axonius fields are mapped to their corresponding ECS fields where possible.

Test samples were derived from live data samples, which were subsequently
sanitized.

Checklist

  • I have reviewed tips for building integrations and this pull request is aligned with them.
  • I have verified that all data streams collect metrics or logs.
  • I have added an entry to my package's changelog.yml file.
  • I have verified that Kibana version constraints are current according to guidelines.
  • I have verified that any added dashboard complies with Kibana's Dashboard good practices

How to test this PR locally

To test the axonius package:

  • Clone integrations repo.
  • Install elastic package locally.
  • Start elastic stack using elastic-package.
  • Move to integrations/packages/axonius directory.
  • Run the following command to run tests.

elastic-package test

2025/12/18 17:48:46  INFO New version is available - v0.117.1. Download from: https://github.com/elastic/elastic-package/releases/tag/v0.117.1
Run asset tests for the package
2025/12/18 17:48:46  INFO License text found in "/root/GITHUB/integrations/LICENSE.txt" will be included in package
--- Test results for package: axonius - START ---
╭─────────┬─────────────┬───────────┬──────────────────────────────────────────────────────────────────┬────────┬──────────────╮
│ PACKAGE │ DATA STREAM │ TEST TYPE │ TEST NAME                                                        │ RESULT │ TIME ELAPSED │
├─────────┼─────────────┼───────────┼──────────────────────────────────────────────────────────────────┼────────┼──────────────┤
│ axonius │             │ asset     │ dashboard axonius-60472232-ca7b-45e6-9fa6-72e6efc41a8e is loaded │ PASS   │      1.422µs │
│ axonius │ identity    │ asset     │ index_template logs-axonius.identity is loaded                   │ PASS   │        348ns │
│ axonius │ identity    │ asset     │ ingest_pipeline logs-axonius.identity-0.1.0 is loaded            │ PASS   │        233ns │
╰─────────┴─────────────┴───────────┴──────────────────────────────────────────────────────────────────┴────────┴──────────────╯
--- Test results for package: axonius - END   ---
Done
Run pipeline tests for the package
--- Test results for package: axonius - START ---
╭─────────┬─────────────┬───────────┬─────────────────────────────────────────────────────┬────────┬──────────────╮
│ PACKAGE │ DATA STREAM │ TEST TYPE │ TEST NAME                                           │ RESULT │ TIME ELAPSED │
├─────────┼─────────────┼───────────┼─────────────────────────────────────────────────────┼────────┼──────────────┤
│ axonius │ identity    │ pipeline  │ (ingest pipeline warnings test-account.log)         │ PASS   │ 778.105629ms │
│ axonius │ identity    │ pipeline  │ (ingest pipeline warnings test-certificate.log)     │ PASS   │ 700.415371ms │
│ axonius │ identity    │ pipeline  │ (ingest pipeline warnings test-group.log)           │ PASS   │ 662.882359ms │
│ axonius │ identity    │ pipeline  │ (ingest pipeline warnings test-identity-common.log) │ PASS   │ 763.614554ms │
│ axonius │ identity    │ pipeline  │ (ingest pipeline warnings test-user.log)            │ PASS   │ 639.719729ms │
│ axonius │ identity    │ pipeline  │ test-account.log                                    │ PASS   │ 296.335698ms │
│ axonius │ identity    │ pipeline  │ test-certificate.log                                │ PASS   │ 309.327719ms │
│ axonius │ identity    │ pipeline  │ test-group.log                                      │ PASS   │ 308.939347ms │
│ axonius │ identity    │ pipeline  │ test-identity-common.log                            │ PASS   │ 291.192435ms │
│ axonius │ identity    │ pipeline  │ test-user.log                                       │ PASS   │ 316.869779ms │
╰─────────┴─────────────┴───────────┴─────────────────────────────────────────────────────┴────────┴──────────────╯
--- Test results for package: axonius - END   ---
Done
Run policy tests for the package
--- Test results for package: axonius - START ---
No test results
--- Test results for package: axonius - END   ---
Done
Run static tests for the package
--- Test results for package: axonius - START ---
╭─────────┬─────────────┬───────────┬──────────────────────────┬────────┬──────────────╮
│ PACKAGE │ DATA STREAM │ TEST TYPE │ TEST NAME                │ RESULT │ TIME ELAPSED │
├─────────┼─────────────┼───────────┼──────────────────────────┼────────┼──────────────┤
│ axonius │ identity    │ static    │ Verify sample_event.json │ PASS   │ 268.878426ms │
╰─────────┴─────────────┴───────────┴──────────────────────────┴────────┴──────────────╯
--- Test results for package: axonius - END   ---
Done
Run system tests for the package
2025/12/18 17:48:59  INFO Installing package...
2025/12/18 17:48:59  INFO License text found in "/root/GITHUB/integrations/LICENSE.txt" will be included in package
2025/12/18 17:49:01  INFO Running test for data_stream "identity" with configuration 'default'
2025/12/18 17:49:09  INFO Setting up independent Elastic Agent...
2025/12/18 17:49:20  INFO Setting up service...
2025/12/18 17:49:40  INFO Validating test case...
2025/12/18 17:49:42  INFO Tearing down service...
2025/12/18 17:49:43  INFO Write container logs to file: /root/GITHUB/integrations/build/container-logs/axonius-1766060383822768504.log
2025/12/18 17:49:47  INFO Tearing down agent...
2025/12/18 17:49:48  INFO Write container logs to file: /root/GITHUB/integrations/build/container-logs/elastic-agent-1766060388442966883.log
2025/12/18 17:50:15  INFO Uninstalling package...
--- Test results for package: axonius - START ---
╭─────────┬─────────────┬───────────┬───────────┬────────┬───────────────╮
│ PACKAGE │ DATA STREAM │ TEST TYPE │ TEST NAME │ RESULT │  TIME ELAPSED │
├─────────┼─────────────┼───────────┼───────────┼────────┼───────────────┤
│ axonius │ identity    │ system    │ default   │ PASS   │ 41.623316269s │
╰─────────┴─────────────┴───────────┴───────────┴────────┴───────────────╯
--- Test results for package: axonius - END   ---
Done

Related issues

Screenshots

image (5) image (6)

@muskan-agarwal26 muskan-agarwal26 changed the base branch from main to feature/axonius-0.1.0 December 18, 2025 12:22
@elastic-vault-github-plugin-prod
Copy link
Copy Markdown

Package microsoft_exchange_online_message_trace - 1.29.1 containing this change is available at https://epr.elastic.co/package/microsoft_exchange_online_message_trace/1.29.1/

@andrewkroh andrewkroh added Crest Contributions from Crest developement team. New Integration Issue or pull request for creating a new integration package. dashboard Relates to a Kibana dashboard bug, enhancement, or modification. documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. Integration:axonius [Integration not found in source] labels Jan 8, 2026
@botelastic
Copy link
Copy Markdown

botelastic Bot commented Feb 7, 2026

Hi! We just realized that we haven't looked into this PR in a while. We're sorry! We're labeling this issue as Stale to make it hit our filters and make sure we get back to it as soon as possible. In the meantime, it'd be extremely helpful if you could take a look at it as well and confirm its relevance. A simple comment with a nice emoji will be enough :+1. Thank you for your contribution!

@botelastic botelastic Bot added the Stalled label Feb 7, 2026
@botelastic
Copy link
Copy Markdown

botelastic Bot commented Mar 9, 2026

Hi! This PR has been stale for a while and we're going to close it as part of our cleanup procedure. We appreciate your contribution and would like to apologize if we have not been able to review it, due to the current heavy load of the team. Feel free to re-open this PR if you think it should stay open and is worth rebasing. Thank you for your contribution!

@botelastic botelastic Bot closed this Mar 9, 2026
@cpascale43 cpascale43 reopened this Mar 9, 2026
@botelastic botelastic Bot removed the Stalled label Mar 9, 2026
@botelastic
Copy link
Copy Markdown

botelastic Bot commented Apr 8, 2026

Hi! We just realized that we haven't looked into this PR in a while. We're sorry! We're labeling this issue as Stale to make it hit our filters and make sure we get back to it as soon as possible. In the meantime, it'd be extremely helpful if you could take a look at it as well and confirm its relevance. A simple comment with a nice emoji will be enough :+1. Thank you for your contribution!

@botelastic botelastic Bot added the Stalled label Apr 8, 2026
@cpascale43 cpascale43 removed the Stalled label Apr 8, 2026
@muskan-agarwal26 muskan-agarwal26 marked this pull request as ready for review April 19, 2026 14:11
@muskan-agarwal26 muskan-agarwal26 requested a review from a team as a code owner April 19, 2026 14:11
Comment thread packages/axonius/manifest.yml Outdated
Comment thread packages/axonius/_dev/deploy/docker/files/config.yml
Comment thread packages/axonius/docs/README.md Outdated
Comment thread packages/axonius/data_stream/identity/elasticsearch/ingest_pipeline/default.yml Outdated
Comment thread packages/axonius/elasticsearch/transform/latest_identity/fields/fields.yml Outdated
:
string(resp.Status) + " (" + string(resp.StatusCode) + ")"
),
"asset_type": string(state.worklist.asset_type_list[0]),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does this need a string conversion?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need, removing string conversion for this from everywhere in code.

Comment thread packages/axonius/_dev/deploy/docker/files/config.yml
Comment on lines +97 to +100
on_failure:
- append:
field: error.message
value: 'Processor {{{_ingest.on_failure_processor_type}}} with tag {{{_ingest.on_failure_processor_tag}}} in pipeline {{{_ingest.on_failure_pipeline}}} failed with message: {{{_ingest.on_failure_message}}}'
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Check that all date and convert processors will remove the field value on failure. This field is defined as a date so if it fails we have left an unmappable value in place.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this be more concisely/manageably expressed with some/most of the processors replaced with a script

Comment thread packages/axonius/changelog.yml Outdated
Comment on lines +2 to +6
- version: 0.1.1
changes:
- description: Add support for identity data stream.
type: enhancement
link: https://github.com/elastic/integrations/pull/16620
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be in the 0.1.1 changes. This is not being merged into main in this PR.

Comment thread packages/axonius/manifest.yml Outdated
name: axonius
title: Axonius
version: 0.1.0
version: 0.1.1
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
version: 0.1.1
version: 0.1.0

"id": "axonius-60472232-ca7b-45e6-9fa6-72e6efc41a8e",
"references": [
{
"id": "metrics-*",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logs?

"type": "index-pattern"
},
{
"id": "metrics-*",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logs? Also, duplicate of the index-pattern at L1275.

Comment on lines +1334 to +1338
{
"id": "logs-*",
"name": "kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index",
"type": "index-pattern"
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate of pattern at L1279.

Comment thread packages/axonius/elasticsearch/transform/latest_identity/fields/fields.yml Outdated
@andrewkroh andrewkroh removed the New Integration Issue or pull request for creating a new integration package. label Apr 20, 2026
name: '{{ IngestPipeline "pipeline-account" }}'
tag: pipeline-account
if: >-
ctx.axonius?.identity?.asset_type.contains('accounts')
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High ingest_pipeline/default.yml:605

The pipeline routing conditions on lines 605, 610, 615, and 620 use ctx.axonius?.identity?.asset_type.contains(...) which throws a NullPointerException when asset_type is null. The optional chaining only guards axonius and identity; once identity exists, the expression evaluates to null.contains(...) when asset_type is missing. This causes the entire pipeline to fail and fall through to on_failure, leaving documents incompletely processed. Consider adding null guards like ctx.axonius?.identity?.asset_type != null && ctx.axonius.identity.asset_type.contains('accounts') for all four conditions.

-        ctx.axonius?.identity?.asset_type.contains('accounts')
+        ctx.axonius?.identity?.asset_type != null && ctx.axonius.identity.asset_type.contains('accounts')
🤖 Copy this AI Prompt to have your agent fix this:
In file packages/axonius/data_stream/identity/elasticsearch/ingest_pipeline/default.yml around line 605:

The pipeline routing conditions on lines 605, 610, 615, and 620 use `ctx.axonius?.identity?.asset_type.contains(...)` which throws a `NullPointerException` when `asset_type` is null. The optional chaining only guards `axonius` and `identity`; once `identity` exists, the expression evaluates to `null.contains(...)` when `asset_type` is missing. This causes the entire pipeline to fail and fall through to `on_failure`, leaving documents incompletely processed. Consider adding null guards like `ctx.axonius?.identity?.asset_type != null && ctx.axonius.identity.asset_type.contains('accounts')` for all four conditions.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This assessment is correct; there is no previous condition or action that guarantees that asset_type is not absent or null. An alternative fix is to use ctx.axonius?.identity?.asset_type?.contains('accounts') == true.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for confirming the issue and suggesting the alternative approach. The ?.contains(...) == true pattern is indeed cleaner and more concise.

Would you like me to fix all four conditions (lines 605, 610, 615, and 620) using this approach?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leave all fixes for the author.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Understood. I'll leave this for the author to fix.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keeping it as is.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

Comment on lines +971 to +972
type: boolean
description: Indicates if auto-delete days for cloud recordings is configured.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium fields/fields.yml:971

axonius.identity.recording.auto_delete_cmr_days is defined as type: boolean, but the field name indicates it should store a numeric day count. When the Zoom API sends an integer like 30, the ingest pipeline's boolean conversion coerces it to true, silently dropping the actual value. Consider changing the type to long and removing this field from the boolean conversion script in pipeline-user.yml.

            - name: auto_delete_cmr_days
-              type: boolean
+              type: long
🤖 Copy this AI Prompt to have your agent fix this:
In file packages/axonius/elasticsearch/transform/latest_identity/fields/fields.yml around lines 971-972:

`axonius.identity.recording.auto_delete_cmr_days` is defined as `type: boolean`, but the field name indicates it should store a numeric day count. When the Zoom API sends an integer like `30`, the ingest pipeline's boolean conversion coerces it to `true`, silently dropping the actual value. Consider changing the type to `long` and removing this field from the boolean conversion script in `pipeline-user.yml`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a test that exercises this? Is it documented somewhere? I don't see it in any tests.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No tests currently exercise this field. I found it in the boolean conversion script at pipeline-user.yml line 775, where it's listed alongside other recording.* fields to be converted to boolean. The field is documented as type boolean with description "Indicates if auto-delete days for cloud recordings is configured." However, the field name auto_delete_cmr_days suggests it should store the actual day count (e.g., 30, 60, 90), not just a boolean flag—that's what the companion field auto_delete_cmr is for.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment was actually directed to @muskan-agarwal26.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, in live logs, we are getting value as true or false, hence it is kept boolean

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

Comment thread packages/axonius/elasticsearch/transform/latest_identity/fields/fields.yml Outdated
Comment on lines +88 to +97
- foreach:
field: axonius.identity.user_count_link
tag: foreach_user_count_link_value
if: ctx.axonius?.identity?.user_count_link instanceof List
processor:
append:
field: related.user
tag: append_user_count_link_value_into_related_user
value: '{{{_ingest._value.value}}}'
allow_duplicates: false
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium ingest_pipeline/pipeline-group.yml:88

The append processor at line 96 uses '{{{_ingest._value.value}}}' without an if condition or ignore_missing check, so when a user_count_link element lacks a value field or has an empty/null value, the mustache template resolves to an empty string that gets appended to related.user, polluting the array with empty entries. Other foreach loops in this file use ignore_missing: true on their inner processors; this one lacks equivalent protection. Consider adding if: ctx._ingest?._value?.value != null && ctx._ingest._value.value != '' to the append processor.

      - foreach:
       field: axonius.identity.user_count_link
       tag: foreach_user_count_link_value
       if: ctx.axonius?.identity?.user_count_link instanceof List
       processor:
         append:
           field: related.user
           tag: append_user_count_link_value_into_related_user
           value: '{{{_ingest._value.value}}}'
+          if: ctx._ingest?._value?.value != null && ctx._ingest._value.value != ''
           allow_duplicates: false
Also found in 1 other location(s)

packages/axonius/data_stream/identity/elasticsearch/ingest_pipeline/pipeline-user.yml:118

At line 118, the append processor inside the foreach over axonius.identity.associated_groups appends '{{{_ingest._value.display_name}}}' to related.user without any null/empty guard on the inner processor. If any group element has a missing or null display_name, the Mustache template renders to an empty string "", which gets appended to the related.user array. Other similar foreach+append patterns in the pipeline (e.g., lines 411-416 for first_name) have explicit if conditions, but this one does not.

🤖 Copy this AI Prompt to have your agent fix this:
In file packages/axonius/data_stream/identity/elasticsearch/ingest_pipeline/pipeline-group.yml around lines 88-97:

The `append` processor at line 96 uses `'{{{_ingest._value.value}}}'` without an `if` condition or `ignore_missing` check, so when a `user_count_link` element lacks a `value` field or has an empty/null value, the mustache template resolves to an empty string that gets appended to `related.user`, polluting the array with empty entries. Other `foreach` loops in this file use `ignore_missing: true` on their inner processors; this one lacks equivalent protection. Consider adding `if: ctx._ingest?._value?.value != null && ctx._ingest._value.value != ''` to the `append` processor.

Also found in 1 other location(s):
- packages/axonius/data_stream/identity/elasticsearch/ingest_pipeline/pipeline-user.yml:118 -- At line 118, the `append` processor inside the `foreach` over `axonius.identity.associated_groups` appends `'{{{_ingest._value.display_name}}}'` to `related.user` without any null/empty guard on the inner processor. If any group element has a missing or null `display_name`, the Mustache template renders to an empty string `""`, which gets appended to the `related.user` array. Other similar `foreach`+`append` patterns in the pipeline (e.g., lines 411-416 for `first_name`) have explicit `if` conditions, but this one does not.

Copy link
Copy Markdown
Contributor

@efd6 efd6 Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not possible; conditionals in foreach processors are not usable. See ref.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're correct—my research confirms the codebase avoids inner conditionals in foreach processors due to this limitation. The alternative would be a script processor to check for null/empty values before appending, but that adds complexity. Is the risk of empty strings in related.user acceptable here, or would you like me to implement a script-based solution?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

any empty value will be dropped including the object in which it populates, so there is no need of if condition here

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@muskan-agarwal26 muskan-agarwal26 requested a review from efd6 April 21, 2026 12:57
Copy link
Copy Markdown
Contributor

@efd6 efd6 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address https://github.com/elastic/integrations/pull/16620/changes#r3107948170 and the macroscopeapp concerns.

Comment on lines +2329 to +2338
{
"id": "logs-*",
"name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index",
"type": "index-pattern"
},
{
"id": "logs-*",
"name": "kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index",
"type": "index-pattern"
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This duplication still exists.

Copy link
Copy Markdown
Contributor Author

@muskan-agarwal26 muskan-agarwal26 Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had reverted that but after exporting the dashboard again, the entry got added again
also, I had a look in other integration's dashboards, they have duplicate entries similarly

@muskan-agarwal26
Copy link
Copy Markdown
Contributor Author

@efd6 I have addressed the comment: https://github.com/elastic/integrations/pull/16620/changes#r3107948170 , used script processors to reduce the count of processors.

@muskan-agarwal26 muskan-agarwal26 requested a review from efd6 April 22, 2026 14:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Crest Contributions from Crest developement team. dashboard Relates to a Kibana dashboard bug, enhancement, or modification. documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. Integration:axonius [Integration not found in source]

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants