/** * Factory method to create a new {@link AuditEvent} in case a sub class wants to create a different derived kind of event */ protected AuditEvent createAuditEvent(AbstractExchangeEvent ae) { return new AuditEvent(ae.getExchange(), ae); }
protected String toJson(AbstractExchangeEvent event) { ClassLoader cl = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(Auditor.class.getClassLoader()); String eventType = event.getClass().getSimpleName(); eventType = eventType.substring("Exchange".length()); eventType = eventType.substring(0, eventType.length() - "Event".length()); CompiledTemplate template = getTemplate(eventType, event.getExchange()); Map<String, Object> vars = new HashMap<String, Object>(); vars.put("event", eventType); vars.put("host", System.getProperty("runtime.id")); vars.put("timestamp", new Date()); vars.put("exchange", event.getExchange()); return TemplateRuntime.execute(template, context, vars).toString(); } finally { Thread.currentThread().setContextClassLoader(cl); } }
protected String toJson(AbstractExchangeEvent event) { ClassLoader cl = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(Auditor.class.getClassLoader()); String eventType = event.getClass().getSimpleName(); eventType = eventType.substring("Exchange".length()); eventType = eventType.substring(0, eventType.length() - "Event".length()); CompiledTemplate template = getTemplate(eventType, event.getExchange()); Map<String, Object> vars = new HashMap<String, Object>(); vars.put("event", eventType); vars.put("host", System.getProperty("karaf.name")); vars.put("timestamp", new Date()); vars.put("exchange", event.getExchange()); return TemplateRuntime.execute(template, context, vars).toString(); } finally { Thread.currentThread().setContextClassLoader(cl); } }
default Tags getTags(AbstractExchangeEvent event, Endpoint endpoint) { return Tags.of( CAMEL_CONTEXT_TAG, event.getExchange().getContext().getName(), SERVICE_NAME, MicrometerEventNotifierService.class.getSimpleName(), EVENT_TYPE_TAG, event.getClass().getSimpleName(), ENDPOINT_NAME, endpoint.getEndpointUri(), FAILED_TAG, Boolean.toString(event.getExchange().isFailed()) ); } }
@Override public void notify(EventObject eventObject) throws Exception { if (eventObject instanceof AbstractExchangeEvent) { AbstractExchangeEvent aee = (AbstractExchangeEvent) eventObject; if (isEnabled(aee.getExchange())) { if (aee instanceof ExchangeSendingEvent) { aee.getExchange().getIn().setHeader("AuditCallId", aee.getExchange().getContext().getUuidGenerator().generateUuid()); } String json = toJson(aee); storage.store(type, System.currentTimeMillis(), json); } } }
protected void handleDoneEvent(AbstractExchangeEvent doneEvent) { String name = namingStrategy.getName(doneEvent.getExchange(), doneEvent.getExchange().getFromEndpoint()); Tags tags = namingStrategy.getTags(doneEvent, doneEvent.getExchange().getFromEndpoint()); // Would have preferred LongTaskTimer, but you cannot set the FAILED_TAG once it is registered Timer.Sample sample = (Timer.Sample) doneEvent.getExchange().removeProperty("eventTimer:" + name); if (sample != null) { sample.stop(getMeterRegistry().timer(name, tags)); } }
@Override public void notify(EventObject eventObject) throws Exception { if (eventObject instanceof AbstractExchangeEvent) { AbstractExchangeEvent aee = (AbstractExchangeEvent) eventObject; if (isEnabled(aee.getExchange())) { if (aee instanceof ExchangeSendingEvent) { aee.getExchange().getIn().setHeader("AuditCallId", aee.getExchange().getContext().getUuidGenerator().generateUuid()); } String json = toJson(aee); if (getStorage() != null) { getStorage().store(type, System.currentTimeMillis(), json); } } } }
@Override public void notify(EventObject eventObject) { if (!(getIgnoreExchanges().test(((AbstractExchangeEvent) eventObject).getExchange()))) { if (eventObject instanceof ExchangeSentEvent) { handleSentEvent((ExchangeSentEvent) eventObject); } else if (eventObject instanceof ExchangeCreatedEvent) { handleCreatedEvent((ExchangeCreatedEvent) eventObject); } else if (eventObject instanceof ExchangeCompletedEvent || eventObject instanceof ExchangeFailedEvent) { handleDoneEvent((AbstractExchangeEvent) eventObject); } } }
Exchange exchange = exchangeEvent.getExchange(); if (exchange == null) { return false;
private void createDebugRecord(AuditEvent ev) { BasicDBObject object = new BasicDBObject(); object.append("breadCrumbId", ev.getBreadCrumbId()); object.append("eventtype", (ev.getEvent()).getClass().getName()); object.append("endpointURI", ev.getEndpointURI()); object.append("exchangeId", ev.getExchange().getExchangeId()); object.append("exception", ev.getException() == null ? null : ev.getException().toString()); object.append("redelivered", ev.getRedelivered()); object.append("timestamp", ev.getTimestamp()); object.append("sourceContextId", ev.getSourceContextId()); object.append("sourceRouteId", ev.getSourceRouteId()); object.append("inBody", ev.getEvent().getExchange().getIn().getBody(String.class)); object.append("outBody", ev.getEvent().getExchange().hasOut() ? ev.getEvent().getExchange().getOut().getBody(String.class) : null); db.getCollection("baievents").insert(object); }
ae.getExchange().setProperty(AuditConstants.DISPATCH_ID, ae.getExchange().getContext().getUuidGenerator().generateUuid());
private void digestExchangeSendingEvent(AuditEvent ev) { DBObject filter = new BasicDBObject(); filter.put("_id", ev.getBreadCrumbId()); DBObject toApply = new BasicDBObject(); toApply.put("$push", new BasicDBObject("exchanges", new BasicDBObject())); DBObject exchangeToPush = (BasicDBObject) ((BasicDBObject) toApply.get("$push")).get("exchanges"); exchangeToPush.put("endpointUri", ev.getEndpointURI()); exchangeToPush.put("startTimestamp", ev.getTimestamp()); exchangeToPush.put("status", "in_progress"); exchangeToPush.put("exchangeId", ev.getEvent().getExchange().getExchangeId()); exchangeToPush.put("exchangePattern", ev.getEvent().getExchange().getPattern().toString()); exchangeToPush.put("dispatchId", ev.getEvent().getExchange().getProperty(AuditConstants.DISPATCH_ID, String.class)); addCurrentRouteIdIfNeeded(ev, exchangeToPush); try { exchangeToPush.put("in", convertPayload(ev.getExchange().getIn().getBody(), ev.getExchange())); } catch (Exception e) { // nothing } // update the record collectionFor(ev).update(filter, toApply); }
private void digestExchangeCompletedEvent(AuditEvent ev) { DBObject filter = BasicDBObjectBuilder.start() .append("_id", ev.getBreadCrumbId()) .append("input.endpointUri", ev.getEndpointURI()) .append("input.exchangeId", ev.getExchange().getExchangeId()) .append("exchanges.dispatchId", ev.getEvent().getExchange().getProperty(AuditConstants.DISPATCH_ID, String.class)).get(); DBObject toApply = new BasicDBObject(); toApply.put("$set", new BasicDBObject()); DBObject toSet = (BasicDBObject) toApply.get("$set"); toSet.put("input.$.endTimestamp", ev.getTimestamp()); toSet.put("input.$.status", "finished"); // TODO: what if the exchange pattern changed while routing? // if the exchange pattern is InOut, first check if there's an out message, if not, dump the in message as the out (since this is what Camel's PipelineProcessor // will do internally anyway) if (ev.getEvent().getExchange().getPattern() == ExchangePattern.InOut) { Object outBody = null; try { outBody = ev.getExchange().hasOut() ? ev.getExchange().getOut().getBody() : ev.getExchange().getIn().getBody(); // it's okay to insert a null value if the he pattern was InOut toSet.put("input.$.out", convertPayload(outBody, ev.getExchange())); toSet.put("input.$.originalOut", typeConverter.convertTo(String.class, outBody)); } catch (Exception e) { // nothing } } // update the record, only if the filter criteria is met collectionFor(ev).update(filter, toApply); }
.append("startTimestamp", ev.getTimestamp()) .append("status", "in_progress") .append("exchangeId", ev.getEvent().getExchange().getExchangeId()) .append("exchangePattern", ev.getEvent().getExchange().getPattern().toString()) .append("in", inMessage) .append("dispatchId", ev.getEvent().getExchange().getProperty(AuditConstants.DISPATCH_ID, String.class)).get();
public static String endpointUri(EventObject event) { if (event instanceof AuditEvent) { AuditEvent auditEvent = (AuditEvent) event; return auditEvent.getEndpointURI(); } else if (event instanceof ExchangeSendingEvent) { ExchangeSendingEvent sentEvent = (ExchangeSendingEvent) event; return sentEvent.getEndpoint().getEndpointUri(); } else if (event instanceof ExchangeSentEvent) { ExchangeSentEvent sentEvent = (ExchangeSentEvent) event; return sentEvent.getEndpoint().getEndpointUri(); } else if (event instanceof AbstractExchangeEvent) { AbstractExchangeEvent ae = (AbstractExchangeEvent) event; Exchange exchange = ae.getExchange(); if (event instanceof ExchangeFailureHandledEvent || event instanceof ExchangeFailedEvent) { return exchange.getProperty(Exchange.FAILURE_ENDPOINT, String.class); } else { Endpoint fromEndpoint = exchange.getFromEndpoint(); if (fromEndpoint != null) { return fromEndpoint.getEndpointUri(); } } } return null; }
private void digestExchangeSentEvent(AuditEvent ev) { DBObject filter = BasicDBObjectBuilder.start() .append("_id", ev.getBreadCrumbId()) .append("exchanges.endpointUri", ev.getEndpointURI()) .append("exchanges.exchangeId", ev.getExchange().getExchangeId()) .append("exchanges.dispatchId", ev.getEvent().getExchange().getProperty(AuditConstants.DISPATCH_ID, String.class)).get(); DBObject toApply = BasicDBObjectBuilder.start() .push("$set") .append("exchanges.$.endTimestamp", ev.getTimestamp()) .append("exchanges.$.status", "finished").get(); // if the exchange pattern is InOut, first check if there's an out message, if not, dump the in message as the out (since this is what Camel's PipelineProcessor // will do internally anyway) if (ev.getEvent().getExchange().getPattern() == ExchangePattern.InOut) { Object outBody = null; try { outBody = ev.getExchange().hasOut() ? ev.getExchange().getOut().getBody() : ev.getExchange().getIn().getBody(); // it's okay to insert a null value if the he pattern was InOut ((BasicDBObject) toApply.get("$set")).put("exchanges.$.out", convertPayload(outBody, ev.getExchange())); } catch (Exception e) { // nothing } } // update the record, only if the filter criteria is met collectionFor(ev).update(filter, toApply); }
filter.put("exchanges.exchangeId", ev.getEvent().getExchange().getExchangeId()); filter.put("exchanges.dispatchId", ev.getEvent().getExchange().getProperty(AuditConstants.DISPATCH_ID, String.class)); toUpdate = BasicDBObjectBuilder.start() .push("$set") filter.put("in.exchangeId", ev.getEvent().getExchange().getExchangeId()); filter.put("in.dispatchId", ev.getEvent().getExchange().getProperty(AuditConstants.DISPATCH_ID, String.class)); toUpdate = BasicDBObjectBuilder.start() .push("$set")