From 915b169471ab58770b8f35ef0aa86a1d6851fe62 Mon Sep 17 00:00:00 2001 From: Patrick Date: Wed, 27 Jan 2021 13:08:58 +0100 Subject: [PATCH 1/2] add jms extension --- extensions/jms/_jms-shared.yml | 205 ++++++++++++++++++ extensions/jms/jms-propagation.yml | 34 +++ extensions/jms/jms-service-graph.yml | 60 +++++ extensions/jms/jms-tracing.yml | 58 +++++ .../spring-data-repository-profiling.yml | 18 +- 5 files changed, 366 insertions(+), 9 deletions(-) create mode 100644 extensions/jms/_jms-shared.yml create mode 100644 extensions/jms/jms-propagation.yml create mode 100644 extensions/jms/jms-service-graph.yml create mode 100644 extensions/jms/jms-tracing.yml diff --git a/extensions/jms/_jms-shared.yml b/extensions/jms/_jms-shared.yml new file mode 100644 index 0000000..d76794c --- /dev/null +++ b/extensions/jms/_jms-shared.yml @@ -0,0 +1,205 @@ +inspectit: + instrumentation: + + actions: + 'a_jms_getDestination': + imports: + - 'javax.jms' + input: + _arg0: Object + _this: Object + value-body: | + Destination dest = null; + if(_arg0 instanceof Destination) { + dest = (Destination) _arg0; + } + if(_this instanceof MessageProducer && dest == null){ + dest = ((MessageProducer)_this).getDestination(); + } + if(_arg0 instanceof Message && dest == null) { + dest = ((Message) _arg0).getJMSDestination(); + } + if(dest instanceof Queue) { + return ((Queue)dest).getQueueName(); + } + if(dest instanceof Topic) { + return ((Topic)dest).getTopicName(); + } + return null; + + 'a_jms_write_down_propagation': + is-void: true + imports: + - java.util + - javax.jms + input: + msgIndex: int + _args: Object[] + _attachments: ObjectAttachments + _context: InspectitContext + value-body: | + Message msg = (Message)_args[msgIndex]; + Object propagationAlreadyPerformed = _attachments.attach(msg, "down_prop_performed", Boolean.TRUE); + if(propagationAlreadyPerformed == null) { + Map headers = _context.getDownPropagationHeaders(); + Iterator it = headers.entrySet().iterator(); + while(it.hasNext()) { + Map$Entry e = (Map$Entry) it.next(); + //we remove hyphens as they are not allowed as property names by the JMS spec + msg.setStringProperty( ((String) e.getKey()).replaceAll("-",""), (String) e.getValue()); + } + } + + 'a_jms_read_down_propagation': + is-void: true + imports: + - 'java.util' + - 'javax.jms' + input: + msgIndex: int + _args: Object[] + _attachments: ObjectAttachments + _context: InspectitContext + value-body: | + Message msg = (Message)_args[msgIndex]; + Object propagationAlreadyPerformed = _attachments.attach(msg, "down_prop_read", Boolean.TRUE); + if(propagationAlreadyPerformed == null) { + Collection headerKeys = _context.getPropagationHeaderNames(); + Map presentHeaders = new HashMap(); + Iterator it = headerKeys.iterator(); + while(it.hasNext()) { + String name = (String) it.next(); + String nameWithoutHyphens = name.replaceAll("-",""); + String value = msg.getStringProperty(nameWithoutHyphens); + if (value != null) { + presentHeaders.put(name, value); + } + } + _context.readDownPropagationHeaders(presentHeaders); + } + + scopes: + 's_jms_MessageListener_onMessage': + interfaces: + - name: 'javax.jms.MessageListener' + methods: + - name: 'onMessage' + advanced: + instrument-only-inherited-methods: true + + 's_jms_SessionAwareMessageListener_onMessage': + interfaces: + - name: 'org.springframework.jms.listener.SessionAwareMessageListener' + methods: + - name: 'onMessage' + advanced: + instrument-only-inherited-methods: true + + 's_jms_MessageProducer_send_arg0msg': + interfaces: + - name: 'javax.jms.MessageProducer' + methods: + - name: 'send' + arguments: [ 'javax.jms.Message' ] + - name: 'send' + arguments: [ 'javax.jms.Message', 'javax.jms.CompletionListener' ] + - name: 'send' + arguments: [ 'javax.jms.Message', int, int, long ] + - name: 'send' + arguments: [ 'javax.jms.Message',int, int, long, 'javax.jms.CompletionListener' ] + + 's_jms_MessageProducer_send_arg1msg': + interfaces: + - name: 'javax.jms.MessageProducer' + methods: + - name: 'send' + arguments: [ 'javax.jms.Destination', 'javax.jms.Message' ] + - name: 'send' + arguments: [ 'javax.jms.Destination', 'javax.jms.Message', 'javax.jms.CompletionListener' ] + - name: 'send' + arguments: [ 'javax.jms.Destination', 'javax.jms.Message', int, int, long ] + - name: 'send' + arguments: [ 'javax.jms.Destination', 'javax.jms.Message',int, int, long, 'javax.jms.CompletionListener' ] + + 's_jms_QueueSender_send_arg0msg': + interfaces: + - name: 'javax.jms.QueueSender' + methods: + - name: 'send' + arguments: [ 'javax.jms.Message' ] + - name: 'send' + arguments: [ 'javax.jms.Message', int, int, long ] + + 's_jms_QueueSender_send_arg1msg': + interfaces: + - name: 'javax.jms.QueueSender' + methods: + - name: 'send' + arguments: [ 'javax.jms.Queue', 'javax.jms.Message' ] + - name: 'send' + arguments: [ 'javax.jms.Queue', 'javax.jms.Message', int, int, long ] + + 's_jms_TopicPublisher_publish_arg0msg': + interfaces: + - name: 'javax.jms.TopicPublisher' + methods: + - name: 'publish' + arguments: [ 'javax.jms.Message' ] + - name: 'publish' + arguments: [ 'javax.jms.Message', int, int, long ] + + s_jms_TopicPublisher_publish_arg1msg: + interfaces: + - name: 'javax.jms.TopicPublisher' + methods: + - name: 'publish' + arguments: [ 'javax.jms.Topic', 'javax.jms.Message' ] + - name: 'publish' + arguments: [ 'javax.jms.Topic', 'javax.jms.Message', int, int, long ] + + data: + 'jms_send_marker': + down-propagation: JVM_LOCAL + 'jms_receive_marker': + down-propagation: JVM_LOCAL + + rules: + 'r_jms_send_detect_entry': + entry: + 'jms_is_entry': + action: 'a_entrypoint_check' + constant-input: + 'marker': 'jms_send_marker' + + 'r_jms_receive_detect_entry': + entry: + 'jms_is_entry': + action: 'a_entrypoint_check' + constant-input: + 'marker': 'jms_receive_marker' + + 'r_jms_send_extract_details': + include: + 'r_jms_send_detect_entry': true + entry: + 'jms_destination': + only-if-true: 'jms_is_entry' + action: 'a_jms_getDestination' + 'jms_is_error': + only-if-true: 'jms_is_entry' + action: 'a_logic_isNotNull' + data-input: + 'value': _thrown + + 'r_jms_receive_extract_details': + include: + 'r_jms_receive_detect_entry': true + entry: + 'jms_origin': + only-if-true: 'jms_is_entry' + action: 'a_jms_getDestination' + 'jms_is_error': + only-if-true: 'jms_is_entry' + action: 'a_logic_isNotNull' + data-input: + 'value': _thrown \ No newline at end of file diff --git a/extensions/jms/jms-propagation.yml b/extensions/jms/jms-propagation.yml new file mode 100644 index 0000000..4590da1 --- /dev/null +++ b/extensions/jms/jms-propagation.yml @@ -0,0 +1,34 @@ +inspectit: + instrumentation: + rules: + 'r_jms_write_down_propagation_arg0': + scopes: + 's_jms_MessageProducer_send_arg0msg': true + 's_jms_QueueSender_send_arg0msg': true + 's_jms_TopicPublisher_publish_arg0msg': true + post-entry: + do_propagation: + action: 'a_jms_write_down_propagation' + constant-input: + 'msgIndex': 0 + + 'r_jms_write_down_propagation_arg1': + scopes: + 's_jms_MessageProducer_send_arg1msg': true + 's_jms_QueueSender_send_arg1msg': true + 's_jms_TopicPublisher_publish_arg1msg': true + post-entry: + do_propagation: + action: 'a_jms_write_down_propagation' + constant-input: + 'msgIndex': 1 + + 'r_jms_message_listener_read_down_propagation': + scopes: + 's_jms_MessageListener_onMessage': true + 's_jms_SessionAwareMessageListener_onMessage': true + pre-entry: + do_propagation: + action: 'a_jms_read_down_propagation' + constant-input: + 'msgIndex': 0 \ No newline at end of file diff --git a/extensions/jms/jms-service-graph.yml b/extensions/jms/jms-service-graph.yml new file mode 100644 index 0000000..47404c7 --- /dev/null +++ b/extensions/jms/jms-service-graph.yml @@ -0,0 +1,60 @@ +inspectit: + instrumentation: + rules: + 'r_jms_servicegraph_send': + include: + 'r_jms_send_extract_details': true + 'r_servicegraph_prepare_down_propagation': true + 'r_servicegraph_outbound_record_method': true + scopes: + 's_jms_MessageProducer_send_arg0msg': true + 's_jms_MessageProducer_send_arg1msg': true + 's_jms_QueueSender_send_arg0msg': true + 's_jms_QueueSender_send_arg1msg': true + 's_jms_TopicPublisher_publish_arg0msg': true + 's_jms_TopicPublisher_publish_arg1msg': true + entry: + 'servicegraph_is_entry': + only-if-true: 'jms_is_entry' + action: 'a_entrypoint_check' + constant-input: + 'marker': 'servicegraph_inbound_marker' + exit: + 'servicegraph_target_external': + action: 'a_assign_value' + data-input: + 'value': 'jms_destination' + 'servicegraph_is_error': + action: 'a_assign_value' + data-input: + 'value': 'jms_is_error' + 'servicegraph_protocol': + action: 'a_assign_value' + constant-input: + 'value': 'jms' + + 'r_jms_servicegraph_receive': + include: + 'r_jms_receive_extract_details': true + 'r_servicegraph_inbound_record_method': true + scopes: + 's_jms_MessageListener_onMessage' : true + 's_jms_SessionAwareMessageListener_onMessage': true + entry: + 'servicegraph_is_entry': + action: 'a_assign_value' + data-input: + 'value': 'jms_is_entry' + exit: + 'servicegraph_origin_external': + action: 'a_assign_value' + data-input: + 'value': 'jms_origin' + 'servicegraph_is_error': + action: 'a_assign_value' + data-input: + 'value': 'jms_is_error' + 'servicegraph_protocol': + action: 'a_assign_value' + constant-input: + 'value': 'jms' \ No newline at end of file diff --git a/extensions/jms/jms-tracing.yml b/extensions/jms/jms-tracing.yml new file mode 100644 index 0000000..b64a4dc --- /dev/null +++ b/extensions/jms/jms-tracing.yml @@ -0,0 +1,58 @@ +inspectit: + instrumentation: + rules: + + 'r_jms_tracing_defaults': + tracing: + start-span: true + start-span-conditions: + only-if-true: 'jms_is_entry' + error-status: _thrown + attributes: + 'java.exception': _thrown + 'java.fqn': 'method_fqn' + entry: + 'method_fqn': + action: 'a_method_getFQN' + + 'r_jms_tracing_send': + include: + 'r_jms_tracing_defaults': true + 'r_jms_send_extract_details': true + scopes: + 's_jms_MessageProducer_send_arg0msg': true + 's_jms_MessageProducer_send_arg1msg': true + 's_jms_QueueSender_send_arg0msg': true + 's_jms_QueueSender_send_arg1msg': true + 's_jms_TopicPublisher_publish_arg0msg': true + 's_jms_TopicPublisher_publish_arg1msg': true + tracing: + name: 'span_name' + attributes: + 'jms.destination': 'jms_destination' + entry: + 'span_name': + action: 'a_string_concat' + constant-input: + 'a': "JMS: Send to " + data-input: + 'b': 'jms_destination' + + 'r_jms_tracing_receive': + include: + 'r_jms_tracing_defaults': true + 'r_jms_receive_extract_details': true + scopes: + 's_jms_MessageListener_onMessage': true + 's_jms_SessionAwareMessageListener_onMessage': true + tracing: + name: 'span_name' + attributes: + 'jms.origin': 'jms_origin' + entry: + 'span_name': + action: 'a_string_concat' + constant-input: + 'a': "JMS: Receive from " + data-input: + 'b': 'jms_origin' diff --git a/extensions/spring-data-repository/spring-data-repository-profiling.yml b/extensions/spring-data-repository/spring-data-repository-profiling.yml index 2920bf8..db857e7 100644 --- a/extensions/spring-data-repository/spring-data-repository-profiling.yml +++ b/extensions/spring-data-repository/spring-data-repository-profiling.yml @@ -4,14 +4,14 @@ inspectit: instrumentation: scopes: - spring_qemi: + 's_spring_qemi': type: name: org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor methods: - name: invoke actions: - spring_qemi_method_name: + 'a_spring_qemi_method_name': imports: - org.aopalliance.intercept - java.lang.reflect @@ -21,7 +21,7 @@ inspectit: Method method = _arg0.getMethod(); return method.getName(); - spring_qemi_method_clazz: + 'a_spring_qemi_method_clazz': imports: - org.aopalliance.intercept - java.lang.reflect @@ -31,7 +31,7 @@ inspectit: Method method = _arg0.getMethod(); return method.getDeclaringClass(); - spring_qemi_nice_method_clazz: + 'a_spring_qemi_nice_method_clazz': imports: - org.aopalliance.intercept - java.lang.reflect @@ -42,9 +42,9 @@ inspectit: return method.getDeclaringClass().getSimpleName() + "." + method.getName(); rules: - spring_data_tracing: + 'r_spring_data_tracing': scopes: - spring_qemi: true + 's_spring_qemi': true tracing: start-span: true name: nicename @@ -53,8 +53,8 @@ inspectit: target_method: tmethod entry: tclass: - action: spring_qemi_method_clazz + action: 'a_spring_qemi_method_clazz' tmethod: - action: spring_qemi_method_name + action: 'a_spring_qemi_method_name' nicename: - action: spring_qemi_nice_method_clazz + action: 'a_spring_qemi_nice_method_clazz' From 6e76124b069067a5ffa33eabf96bf204436d772e Mon Sep 17 00:00:00 2001 From: Patrick Date: Thu, 25 Feb 2021 11:52:36 +0100 Subject: [PATCH 2/2] Implemented review comments --- extensions/jms/_jms-shared.yml | 156 ++++++++++++++++----------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/extensions/jms/_jms-shared.yml b/extensions/jms/_jms-shared.yml index d76794c..730e192 100644 --- a/extensions/jms/_jms-shared.yml +++ b/extensions/jms/_jms-shared.yml @@ -78,84 +78,84 @@ inspectit: _context.readDownPropagationHeaders(presentHeaders); } - scopes: - 's_jms_MessageListener_onMessage': - interfaces: - - name: 'javax.jms.MessageListener' - methods: - - name: 'onMessage' - advanced: - instrument-only-inherited-methods: true - - 's_jms_SessionAwareMessageListener_onMessage': - interfaces: - - name: 'org.springframework.jms.listener.SessionAwareMessageListener' - methods: - - name: 'onMessage' - advanced: - instrument-only-inherited-methods: true - - 's_jms_MessageProducer_send_arg0msg': - interfaces: - - name: 'javax.jms.MessageProducer' - methods: - - name: 'send' - arguments: [ 'javax.jms.Message' ] - - name: 'send' - arguments: [ 'javax.jms.Message', 'javax.jms.CompletionListener' ] - - name: 'send' - arguments: [ 'javax.jms.Message', int, int, long ] - - name: 'send' - arguments: [ 'javax.jms.Message',int, int, long, 'javax.jms.CompletionListener' ] - - 's_jms_MessageProducer_send_arg1msg': - interfaces: - - name: 'javax.jms.MessageProducer' - methods: - - name: 'send' - arguments: [ 'javax.jms.Destination', 'javax.jms.Message' ] - - name: 'send' - arguments: [ 'javax.jms.Destination', 'javax.jms.Message', 'javax.jms.CompletionListener' ] - - name: 'send' - arguments: [ 'javax.jms.Destination', 'javax.jms.Message', int, int, long ] - - name: 'send' - arguments: [ 'javax.jms.Destination', 'javax.jms.Message',int, int, long, 'javax.jms.CompletionListener' ] - - 's_jms_QueueSender_send_arg0msg': - interfaces: - - name: 'javax.jms.QueueSender' - methods: - - name: 'send' - arguments: [ 'javax.jms.Message' ] - - name: 'send' - arguments: [ 'javax.jms.Message', int, int, long ] - - 's_jms_QueueSender_send_arg1msg': - interfaces: - - name: 'javax.jms.QueueSender' - methods: - - name: 'send' - arguments: [ 'javax.jms.Queue', 'javax.jms.Message' ] - - name: 'send' - arguments: [ 'javax.jms.Queue', 'javax.jms.Message', int, int, long ] - - 's_jms_TopicPublisher_publish_arg0msg': - interfaces: - - name: 'javax.jms.TopicPublisher' - methods: - - name: 'publish' - arguments: [ 'javax.jms.Message' ] - - name: 'publish' - arguments: [ 'javax.jms.Message', int, int, long ] - - s_jms_TopicPublisher_publish_arg1msg: - interfaces: - - name: 'javax.jms.TopicPublisher' - methods: - - name: 'publish' - arguments: [ 'javax.jms.Topic', 'javax.jms.Message' ] - - name: 'publish' - arguments: [ 'javax.jms.Topic', 'javax.jms.Message', int, int, long ] + scopes: + 's_jms_MessageListener_onMessage': + interfaces: + - name: 'javax.jms.MessageListener' + methods: + - name: 'onMessage' + advanced: + instrument-only-inherited-methods: true + + 's_jms_SessionAwareMessageListener_onMessage': + interfaces: + - name: 'org.springframework.jms.listener.SessionAwareMessageListener' + methods: + - name: 'onMessage' + advanced: + instrument-only-inherited-methods: true + + 's_jms_MessageProducer_send_arg0msg': + interfaces: + - name: 'javax.jms.MessageProducer' + methods: + - name: 'send' + arguments: [ 'javax.jms.Message' ] + - name: 'send' + arguments: [ 'javax.jms.Message', 'javax.jms.CompletionListener' ] + - name: 'send' + arguments: [ 'javax.jms.Message', int, int, long ] + - name: 'send' + arguments: [ 'javax.jms.Message',int, int, long, 'javax.jms.CompletionListener' ] + + 's_jms_MessageProducer_send_arg1msg': + interfaces: + - name: 'javax.jms.MessageProducer' + methods: + - name: 'send' + arguments: [ 'javax.jms.Destination', 'javax.jms.Message' ] + - name: 'send' + arguments: [ 'javax.jms.Destination', 'javax.jms.Message', 'javax.jms.CompletionListener' ] + - name: 'send' + arguments: [ 'javax.jms.Destination', 'javax.jms.Message', int, int, long ] + - name: 'send' + arguments: [ 'javax.jms.Destination', 'javax.jms.Message',int, int, long, 'javax.jms.CompletionListener' ] + + 's_jms_QueueSender_send_arg0msg': + interfaces: + - name: 'javax.jms.QueueSender' + methods: + - name: 'send' + arguments: [ 'javax.jms.Message' ] + - name: 'send' + arguments: [ 'javax.jms.Message', int, int, long ] + + 's_jms_QueueSender_send_arg1msg': + interfaces: + - name: 'javax.jms.QueueSender' + methods: + - name: 'send' + arguments: [ 'javax.jms.Queue', 'javax.jms.Message' ] + - name: 'send' + arguments: [ 'javax.jms.Queue', 'javax.jms.Message', int, int, long ] + + 's_jms_TopicPublisher_publish_arg0msg': + interfaces: + - name: 'javax.jms.TopicPublisher' + methods: + - name: 'publish' + arguments: [ 'javax.jms.Message' ] + - name: 'publish' + arguments: [ 'javax.jms.Message', int, int, long ] + + s_jms_TopicPublisher_publish_arg1msg: + interfaces: + - name: 'javax.jms.TopicPublisher' + methods: + - name: 'publish' + arguments: [ 'javax.jms.Topic', 'javax.jms.Message' ] + - name: 'publish' + arguments: [ 'javax.jms.Topic', 'javax.jms.Message', int, int, long ] data: 'jms_send_marker':