OpenPipeline can be used to convert different incoming ingest sources to business events. This is useful if logs or traces contain business-relevant information, or no other ingest path for business events is available.
All business event processors in OpenPipeline share the same baseline configuration fields. These fields determine how incoming records are evaluated, enriched, and transformed into business events.
| Field | Description | Examples |
|---|---|---|
Name | Identifies the use case for the pipeline creation. |
|
Matching condition | Condition that must be met for the record to be converted into a business event. | |
Event provider | Identifies the source or component that emitted the event. Can be taken from the payload or defined statically. | Field name: |
Event type | Identifies the business event type. Takes either a field from the payload or a static string. | Field name: |
Fields extraction | Determines which attributes from the record are included in the business event. |
|
Business events can be ingested directly via API ingestion. This is the preferred path when upstream applications already emit JSON payloads that include the event fields required for processing (for example, event.type, event.provider, and other custom attributes). When the incoming JSON already conforms to the Business Events schema, no additional extraction is necessary, and the payload can be forwarded as a business event directly to Dynatrace.
{"event.provider": "easytrade.api","event.type": "buy-asset","timestamp": "2026-03-13T12:13:00Z","service": {"name": "easytrade-checkout-service","id": "svc-easytrade-01"},"order": {"orderId": "ord-2002","amount": 3500.50,"currency": "USD","assetType": "bond"},"customer": {"id": "cust-900","tier": "premium"},"request": {"is_failed": false}}
If your API payload already contains the required event fields, it can be sent directly to Dynatrace without additional steps. However, you can use OpenPipeline to route or enrich API-ingested events when further processing is required.
To add further processing to your business event:
easytrade api pipeline.premium customer revenue.event.type == "buy-asset" AND customer.tier == "premium".biz.easytrade.premium.revenue.order.amount.dt.entity.service and service.name.easyTrade API route.event.provider == "easytrade.api".easytrade api pipeline.In the following examples, you can see how ingest pipeline processing can be used to meet your technical and administrative requirements.
As a user, you need to add a calculated dollar trading volume value to the pipeline.
{"action":"buy","accountId":6,"amount":10,"instrumentId":1,"price":157.025}
matchesValue(action, "buy")| Name | Type | Optional | is Array | Read-only |
|---|---|---|---|---|
amount | double | false | false | true |
price | double | false | false | true |
FIELDS_ADD(trading_volume: price*amount)You need to hide the CVV field on your credit card in an incoming JSON payload.
{"action": "payment","creditCardNumber":"5570001112223344","valid":"12/27","cvv":"001"}
matchesValue(action, "payment")| Name | Type | Optional | is Array | Read-only |
|---|---|---|---|---|
cvv | string | false | false | false |
FIELDS_ADD(cvv: SHA1(cvv))You need to drop the birthdate field in an incoming JSON payload.
{"action": "newUser","firstName":"Frank","lastName": "Underwud","birthDate": "10.01.1967"}
matchesValue(action, "newUser")| Name | Type | Optional | is Array | Read-only |
|---|---|---|---|---|
birthDate | string | false | false | false |
FIELDS_REMOVE(birthDate)You need to parse attributes from a nested JSON in order to have them as top-level attributes in Grail.
{"action":"sell","details":{"accountId":6,"amount":10,"instrumentId":1,"price":157.025}}
matchesValue(action, "sell")| Name | Type | Optional | is Array | Read-only |
|---|---|---|---|---|
details | string | false | false | false |
PARSE(details,"JSON{INTEGER:accountId,INTEGER:amount,INTEGER:instrumentId,DOUBLE:price}(flat=true)") | FIELDS_REMOVE(details)In this example, you need to remove the voucher code from the error message field below to have the ability to count how often the same error message appears. The solution below leverages the Dynatrace Pattern language for parsing.
{"timestamp":"2023-01-18T10:50:23.777000000Z","cartId":"58583939","error.message":"The voucher [XY-892940] is not valid!","error.messageKey":"error.voucher "}
matchesValue(error.messageKey, "error.voucher ")| Name | Type | Optional | is Array | Read-only |
|---|---|---|---|---|
error.message | string | no | no | no |
Processor definition:
FIELDS_ADD(final:REPLACE_PATTERN(error.message, "LD:p1 '[' LD:to_be_masked ']' LD:p2 ", "${p1}${p2}"))
Result: The voucher is not valid!.