Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-21413

Create a TransactionLog transaction log to provide detailed tracking and performance metrics on end-to-end transactions

    XMLWordPrintableJSON

Details

    • Wish
    • Status: Resolved
    • Major
    • Resolution: Won't Fix
    • None
    • None
    • came-core
    • None
    • Guru

    Description

      Wish

      The wish is for a transaction log store in Camel to provide detailed tracking and performance metrics on end-to-end transactions across multiple exchanges/routes, storing metadata, exchange data, and performance metrics in a configurable, persistent registry to better monitor business processes.

      Background

      A lot of data in tracing and observability is on the exchange level. How many exchanges are completed or failed, for example. In many cases, what I really want to know if a transaction is successful or failed.

      With a transaction I mean that the complete lifecycle of a message on Camel, this 
      may contain many routes and exchanges. For example, when Seda or ActiveMQ is used 
      a new exchange is created, but it's still the same transaction.
       
      To have metrics and more insights on transactions, I would like to have a transaction log (through a separate registry?). This is a separate store with information about the transaction. 

      Implementation ideas

      Below are few ideas to implement this wish:

      1. Initialize the store

      Setup a transaction log/store (either in memory or external store) through a registry. This is to enable it and to configure the store.

      2. Transaction item

      A transaction item is a definition of a specific transaction. It may contain the following items:

      • Name: The name to indicate the transaction. Like "order" or "invoice". This is so to say the overarching name of the integration/business process.
      • StartingPoint: A routeId or groupId where the transaction starts (triggers a new transaction).
      • CorrelationID(s): One or more correlationId (headers) that can be set just like a header/exchangePropery/variable, this contains for example the orderID that is set on the first step of the transaction.

      3. Tracking transactions

      A transaction is probably best tracked by something like a breadcrumbId. Preferably a transactionId. At least something that cannot be edited by users (I sometimes see people change the breadcrumbId, to separate transactions into multiple segments).

      By default, only the start and end of a transaction is tracked. To get more fine-grained control, one could also track intermediate points like a route, a step, or a node.

      The transaction is tracked during processing, and then finished on completion. The whole counts as one "UnitOfWork".

      4. The transaction store

      The transaction store contains all the tracked items. Maybe there could be divided into separate segments like:

      1. metadata

          - name (name of the transaction)
          - description (description of type of transaction)
          - transactionId
          - transactionHistory (similar to messageHistory)
          - correlationId(s)
          - timestamps
          - exceptions

      1. exchange data

          - headers, properties, variables
          - bodyType
          - body
          etc

      1. performance metrics

          - load (CPU), memory (RAM), threads
          - number of transactions (completed, pending, failed)
          - throughput
          - response time
          - total process time of an transaction
          - average
          - etc

      It should be possible to configure which of these items the user what want to store. By default, only metadata.

      5. Transaction API's

      There need to be an API to configure and operate the transaction store. (including JMX), similar to backlogtracer.

      Production
      Some of the solutions I saw are only available during development or test, but the need is especially big for production environment. A solution needs to keep in mind that this would run for billion of messages. The flexibility to turn it easily on and off.

      For example, by default, the body of a message doesn't need to be stored. Or only the first 32kb need to be stored. But for specific case users, one to enable this on the fly for a specific transaction.

      Transactions are probably needed persistent, so either need a messagestore (disk) similar to brokers or an external database. I'm not sure what the best stores are for this kind of data. A normal SQL database like Postgres, a search database like Elastic, a metrics database like Prometheus or key/value store like Redis?

      End users

      The idea is that end users have a good insight in what is going on in the integration layer. So that they can question like the following:

      • How many order transactions are processed?
      • Give me a specific order by orderId that custom says he didn't receive?
      • How many failed messages are there? Which ones did go wrong, where did it go wrong, and what is the exact error?
      • Can we replay the failed order?
      • Where is the bottleneck on the system

      Conclusion

      This is just an idea/wish, but something I see coming back from the start of my career as integration specialist (around 2007), until today.

      Most consultancy firms or end customers have built something themselves, I see with names like "Track & Trace", "MessageStore", "ESB Collector", "Transactions", "Control center".

      I also built a solution myself, and are happy to share this solution, or others I saw. A more generic solution to monitor (track & trace) transactions of business processes would be very welcome.

      Attachments

        Activity

          People

            Unassigned Unassigned
            skin27 Raymond
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: