X

Best Practices from Oracle Development's A‑Team

EDN Debugging

Derek Kam
Consulting Solutions Architect

 

This blog has been retired

Introduction

This blog will show you how to debug Oracle EDN (Event Delivery Network) and also describes the tools that can be used to debug EDN.

Main Article

1. Using EDN-DB-LOG

EDN comes with a useful EDN DB logging servlet to view logging information generated by the EDN component. This logging servlet is only available for EDN-DB which is based on AQ, it will not work for EDN with JMS. The servlet uses a table called “EDN_LOG_MESSAGES” in the SOA_INFRA schema. It logs the operation on the “main” operation of event_queue and oaoo-queue with timestamp information.

The default URL is http://<host_name>:<port_number>/soa-infra/events/edn-db-log.  In this servlet, you can enable, disable and clear logs but you need to have the administrative role in order to access the servlet.  This is a good tool to use to display dynamic counts of un-deq'ed (queued)  events (potentially "stuck") in the "main" and "OAOO" queues. The log also provides information on the EDN bus when it is being connected to AQ-DB.  In the screenshot below, “EVENT_SEQ:202” shows that the EDN bus is being started.

 

edndebugging1

When the logging is enabled, the EDN_LOG_MESSAGES table will be populated with messages until the logging is disabled, so it is inadvisable to leave logging turned on for large amounts of events. It is also recommended to clear the log regularly.

Messages in the log are grouped together. Usually, the first line in the group will indicate what operation is being performed, and the event sequence number is used to group the messages together and each group will be highlighted using the same color (e.g. enqueuing an event or handling an event that has been dequeued). In the screenshots below, “EVENT_SEQ:204” is dequeuing an event and “EVENT_SEQ:205” is enqueuing an event.

edndebugging2

 

edndebugging3

2. Database tables

The second method is to examine the database table. You can check on the count of potentially “stuck” events currently in the following queue tables:

  • EDN_EVENT_QUEUE_TABLE – This table is for “EDN_EVENT_QUEUE” AQ. Every event published is temporarily enqueued into this table.

  • EDN_OAOO_DELIVERY_TABLE – This table only stores the event with “OAOO” (one-and-only-one) delivery target(s). The event is temporarily enqueued into this table for END_OAOO_QUEUE AQ.

For an event with an OAOO delivery target, it travels through both tables, first, it is stored in EDN_EVENT_QUEUE_TABLE and then in EDN_OAOO_DELIVERY_TABLE.

This example shows the event enq'ed in "edn_event_queue".

edndebugging4

 

Another alternative is to check the count from the following database views:

  • AQ$EDN_EVENT_QUEUE_TABLE: There are two rows for every event enqueued into "edn_event_queue".

  • AQ$EDN_OAOO_DELIVERY_TABLE: There is one row for every event enqueued into "edn_oaoo_queue".

This example shows further details about that event which is deq'ed by the subscribers of "edn_event_queue".

edndebugging5

The AQ$EDN_EVENT_QUEUE_TABLE.MSG_STATE shows the state of the message.  The states are listed in the table below:

State Code Value Description
0 Ready The message is ready to be processed, i.e., either the delay
time of the message has passed or the message did not have a delay time specified
1 Wait The delay specified by message_properties_t.delay while executing dbms_aq.enqueue has not been reached.
2 Processed The message has been successfully processed (dequeued) but will remain in the queue until the retention_time specified for the queue while executing dbms_aqadm.create_queue has been reached.
3 Expired The message was not successfully processed (dequeued) in either 1) the time specified by message_properties_t.expiration while executing dbms_aq.enqueue or 2) the maximum number of dequeue attempts (max_retries) specified for the queue while executing dbms_aqadm.create_queue.
8 Deferred Buffered messages enqueued by a Streams Capture process
10 Buffered Expired User-enqueued expired buffered messages

 

If the subscriber type is equal to 2 when there is no subscribers to the message, and there is no transaction id due to invalid transaction, it will be marked as UNDELIVERABLE.

When the message state is "Expired", the AQ$EDN_EVENT_QUEUE_TABLE.EXPIRATION_REASON will be populated with one of the following value:

  • Messages to be cleaned up later

  • MAX_RETRY_EXCEEDED

  • TIME_EXPIRATION

  • INVALID_TRANSACTION

  • PROPAGATION_FAILURE

3. Server Logs

The third method for EDN debugging is using EM log configuration and log viewer. There are few logger names related the EDN:

  • oracle.integration.platform.blocks.event

  • oracle.integration.platform.blocks.event

  • oracle.integration.platform.blocks.event.saq

  • oracle.integration.platform.blocks.event.jms

You can set log level to one of the following to capture more details:

  • TRACE:1 (FINE) - Logging the event content details, XPath filter results, event enqueue, dequeue, publish and send operations

  • TRACE:16 (FINER) – Logging the begin, commit and rollback statements of XA transaction (for OAOO) and retry count.

  • TRACE:32 (FINEST)  - All above.

edndebugging6

The log level changes take effect immediately without server restart.However, if you want the changes to persist after server restart, make sure to check on the “Persist Log Level State Across Component Restarts” prior to server restart.

At FINER or FINEST level, you may see log messages like "Began XA for OAOO." and "Rolled back XA for OAOO." These are normal messages of OAOO event delivery when there are no events waiting to be delivered. They typically do not signify error conditions. You may turn off these messages by setting the Java logging level to "TRACE:1 (FINE)" or a higher value. All detailed logging goes into SOA server's diagnostic.log file configured in EM.  Below is a snippet of the diagnostic log showing the event delivery to an OAOO subscriber:


[SRC_METHOD: finerBeganXA] Began XA for OAOO.

[SRC_METHOD: fineEventPublished] Received event: Subject: ... Sender: .... Event: ...

[SRC_METHOD: fineFilterResults] Filter [XPath Filter: …] for subscriber "..." returned true/false

[SRC_METHOD: fineDequeuedEvent] Dequeued event, Subject: ... [source type ..]: business-event...

[SRC_METHOD: fineOAOOEnqueuedEvent] Enqueued OAOO event, Subject: ... [source: ..., target: ... ]: business-event...

[SRC_METHOD: fineOAOODequeuedEvent] Dequeued OAOO event, Subject: ... [source: ..., target: ...]: business-event...

[SRC_METHOD: finerInsertedTryCount] Inserted try count for msgId: .... Status: ...

[SRC_METHOD: finerRemovedTryCount] Removed try count for msgId: ...

[SRC_METHOD: fineSentOAOOEvent] Sent OAOO event [QName: ... to target: ...]: business-event...

[SRC_METHOD: fineCommittedOAOODelivery] Committed OAOO Delivery, Subject: ... [source: ..., target: ...]: business-event...

[SRC_METHOD: finerBeganXA] Began XA for OAOO.

[SRC_METHOD: finerRolledbackXA] Rolled back XA for OAOO.

In some cases, more than one method may be necessary to assist in the debugging process. Below is a comparison of server and DB logging that might help you in evaluating and determining which method(s) is/are most suitable in your environment.

 

Server Logging

  • EDN will generate standard Java logging messages when events are published, when they are pulled from persistent storage and when they are delivered.

  • The logger used by EDN depends on the implementation. For instance, EDN-DB uses "oracle.integration.platform.blocks.event.saq" and EDN-JMS uses "oracle.integration.platform.blocks.event.jms".

  • As in all Java logging, messages are written at different log levels from ERROR to FINEST. The most detailed messages (including the event body) use FINEST.

  • Loggers can also be configured in logging.xml in your config directory.

DB Logging

  • If you are using EDN-DB, a lot of debugging information may not be accessible due to the many activities that occurred in the database which couldn’t be logged in the server. Hence, a servlet web page that accesses the debug logging table is implemented to assist the debugging process. The page is located at http://hostname:port/soa-infra/events/edn-db-log and you do need to have an administrative role to access the servlet page.

  • There are commands on the servlet web page to enable and disable logging and for clearing the log table. The table will be filled with messages, so it is inadvisable to leave logging turned on for large amounts of events. It is recommended to clear the log regularly.

  • Messages in the log are grouped together. Usually, the first line in the group will indicate what operation is being performed (e.g. enqueuing an event or handling an event that has been dequeued).

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.Captcha

Recent Content