diff --git a/packages/cisco_ise/changelog.yml b/packages/cisco_ise/changelog.yml index eaec69ef40c..e71c6261a7c 100644 --- a/packages/cisco_ise/changelog.yml +++ b/packages/cisco_ise/changelog.yml @@ -1,4 +1,9 @@ # newer versions go on top +- version: "1.32.9" + changes: + - description: Handle events without a parseable date as to stop the date processors from throwing a "field [_tmp] not present" error. Also default @timestamp to the ingest time so the event stays queryable instead of being routed to the failure store. + type: bugfix + link: https://github.com/elastic/integrations/pull/20069 - version: "1.32.8" changes: - description: Parse TACACS accounting `start_time` and `stop_time` with second, millisecond, or higher-precision epoch values instead of dropping them as out-of-range dates. diff --git a/packages/cisco_ise/data_stream/log/_dev/test/pipeline/test-pipeline-device-sensor-fragments.log b/packages/cisco_ise/data_stream/log/_dev/test/pipeline/test-pipeline-device-sensor-fragments.log new file mode 100644 index 00000000000..a3a3d081303 --- /dev/null +++ b/packages/cisco_ise/data_stream/log/_dev/test/pipeline/test-pipeline-device-sensor-fragments.log @@ -0,0 +1 @@ +CISE_Profiler 0000034521 2 1 cisco-av-pair=cdp-tlv=cdpCacheAddress=192.0.2.10, cisco-av-pair=lldp-tlv=lldpSystemDescription=Cisco IOS Software C3700 Software, cisco-av-pair=cdp-tlv=cdpCacheDeviceId=SAMPLE-AP-0001, diff --git a/packages/cisco_ise/data_stream/log/_dev/test/pipeline/test-pipeline-device-sensor-fragments.log-expected.json b/packages/cisco_ise/data_stream/log/_dev/test/pipeline/test-pipeline-device-sensor-fragments.log-expected.json new file mode 100644 index 00000000000..01eea910e59 --- /dev/null +++ b/packages/cisco_ise/data_stream/log/_dev/test/pipeline/test-pipeline-device-sensor-fragments.log-expected.json @@ -0,0 +1,32 @@ +{ + "expected": [ + { + "@timestamp": "2026-07-12T13:29:35.843611799Z", + "cisco_ise": { + "log": { + "category": { + "name": "CISE_Profiler" + }, + "message": { + "id": "0000034521" + }, + "segment": { + "number": 1, + "total": 2 + } + } + }, + "ecs": { + "version": "8.17.0" + }, + "event": { + "original": "CISE_Profiler 0000034521 2 1 cisco-av-pair=cdp-tlv=cdpCacheAddress=192.0.2.10, cisco-av-pair=lldp-tlv=lldpSystemDescription=Cisco IOS Software C3700 Software, cisco-av-pair=cdp-tlv=cdpCacheDeviceId=SAMPLE-AP-0001," + }, + "message": "cisco-av-pair=cdp-tlv=cdpCacheAddress=192.0.2.10, cisco-av-pair=lldp-tlv=lldpSystemDescription=Cisco IOS Software C3700 Software, cisco-av-pair=cdp-tlv=cdpCacheDeviceId=SAMPLE-AP-0001,", + "tags": [ + "preserve_original_event", + "cisco_ise.timestamp_defaulted_to_ingest_time" + ] + } + ] +} diff --git a/packages/cisco_ise/data_stream/log/elasticsearch/ingest_pipeline/default.yml b/packages/cisco_ise/data_stream/log/elasticsearch/ingest_pipeline/default.yml index b9c7692077b..ecc910ab241 100644 --- a/packages/cisco_ise/data_stream/log/elasticsearch/ingest_pipeline/default.yml +++ b/packages/cisco_ise/data_stream/log/elasticsearch/ingest_pipeline/default.yml @@ -85,6 +85,10 @@ processors: - date: field: _tmp.timestamp tag: default-tmp-timestamp parsing + description: >- + Avoid processing if _tmp.timestamp is unset, preventing a "field [_tmp] + not present" error on top of the grok_time_details failure. + if: ctx._tmp?.timestamp != null formats: - MMM [ ]d[d] HH:mm:ss[.SSSSSS][.SSS] - ISO8601 @@ -98,7 +102,7 @@ processors: field: error.message value: '{{{ _ingest.on_failure_processor_tag }}}: {{{_ingest.on_failure_message}}}' - date: - if: ctx.event?.timezone != null && ctx.event.timezone != '' + if: ctx._tmp?.timestamp != null && ctx.event?.timezone != null && ctx.event.timezone != '' field: _tmp.timestamp timezone: '{{{event.timezone}}}' tag: default-tmp-timestamp-with timezone parsing @@ -277,6 +281,26 @@ processors: value: preserve_original_event allow_duplicates: false if: ctx.error?.message != null + - append: + tag: append_tag_timestamp_defaulted_to_ingest_time + description: >- + Tag events whose @timestamp is defaulted to ingest time (no event date + parsed) so the assumed timestamps can be filtered out or audited. + field: tags + value: cisco_ise.timestamp_defaulted_to_ingest_time + allow_duplicates: false + if: ctx['@timestamp'] == null + - set: + tag: set_fallback_timestamp_to_ingest_time + description: >- + Default @timestamp to ingest time when no event date was parsed, so + valid but timestamp-less events (e.g. device-sensor fragments) are not + routed to the failure store. Guarded on null to never overwrite a + parsed event time. + field: '@timestamp' + value: '{{{_ingest.timestamp}}}' + if: ctx['@timestamp'] == null + ignore_failure: true on_failure: - set: field: event.kind diff --git a/packages/cisco_ise/data_stream/log/fields/ecs.yml b/packages/cisco_ise/data_stream/log/fields/ecs.yml index 2f6119eef31..95dbdcb9af0 100644 --- a/packages/cisco_ise/data_stream/log/fields/ecs.yml +++ b/packages/cisco_ise/data_stream/log/fields/ecs.yml @@ -78,6 +78,8 @@ name: destination.user.name - external: ecs name: ecs.version +- external: ecs + name: error.message - external: ecs name: event.category - external: ecs diff --git a/packages/cisco_ise/docs/README.md b/packages/cisco_ise/docs/README.md index 43f0a0cfda5..c592fc31df6 100644 --- a/packages/cisco_ise/docs/README.md +++ b/packages/cisco_ise/docs/README.md @@ -661,6 +661,7 @@ The following table lists the exported fields for this data stream: | destination.user.name | Short name or login of the user. | keyword | | destination.user.name.text | Multi-field of `destination.user.name`. | match_only_text | | ecs.version | ECS version this event conforms to. `ecs.version` is a required field and must exist in all events. When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events. | keyword | +| error.message | Error message. | match_only_text | | event.category | This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy. `event.category` represents the "big buckets" of ECS categories. For example, filtering on `event.category:process` yields all events relating to process activity. This field is closely related to `event.type`, which is used as a subcategory. This field is an array. This will allow proper categorization of some events that fall in multiple categories. | keyword | | event.code | Identification code for this event, if one exists. Some event sources use event codes to identify messages unambiguously, regardless of message language or wording adjustments over time. An example of this is the Windows Event ID. | keyword | | event.created | `event.created` contains the date/time when the event was first read by an agent, or by your pipeline. This field is distinct from `@timestamp` in that `@timestamp` typically contain the time extracted from the original event. In most situations, these two timestamps will be slightly different. The difference can be used to calculate the delay between your source generating an event, and the time when your agent first processed it. This can be used to monitor your agent's or pipeline's ability to keep up with your event source. In case the two timestamps are identical, `@timestamp` should be used. | date | diff --git a/packages/cisco_ise/manifest.yml b/packages/cisco_ise/manifest.yml index 98e05e4ca99..a808f9cc0b3 100644 --- a/packages/cisco_ise/manifest.yml +++ b/packages/cisco_ise/manifest.yml @@ -1,7 +1,7 @@ format_version: "3.0.3" name: cisco_ise title: Cisco ISE -version: "1.32.8" +version: "1.32.9" description: Collect logs from Cisco ISE with Elastic Agent. type: integration categories: