├── perf-monitoring-producer-spring-2.7
├── src
│ └── main
│ │ ├── resources
│ │ ├── META-INF
│ │ │ ├── spring
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ ├── spring.factories
│ │ │ └── spring-configuration-metadata.json
│ │ └── config-profiling-default.yml
│ │ └── java
│ │ └── io
│ │ └── bitdive
│ │ ├── jvm_metrics
│ │ ├── MeasurementDto.java
│ │ ├── MetricDto.java
│ │ ├── MetricsCollector.java
│ │ └── MetricsService.java
│ │ ├── aspect
│ │ ├── YamlParserCondition.java
│ │ ├── FeignClientAspect.java
│ │ ├── SchedulerAspect.java
│ │ ├── RepositoryAspect.java
│ │ ├── StompSendToAspect.java
│ │ ├── StompMessageMappingAspect.java
│ │ └── KafkaListenerAspect.java
│ │ ├── SpringConfigProfiling.java
│ │ └── ByteBuddyAgentInitializer.java
└── pom.xml
├── perf-monitoring-producer-spring-3
├── src
│ └── main
│ │ ├── resources
│ │ ├── META-INF
│ │ │ ├── spring
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ ├── spring.factories
│ │ │ └── spring-configuration-metadata.json
│ │ └── config-profiling-default.yml
│ │ └── java
│ │ └── io
│ │ └── bitdive
│ │ ├── jvm_metrics
│ │ ├── MeasurementDto.java
│ │ ├── MetricDto.java
│ │ ├── MetricsCollector.java
│ │ └── MetricsService.java
│ │ ├── aspect
│ │ ├── YamlParserCondition.java
│ │ ├── FeignClientAspect.java
│ │ ├── RepositoryAspect.java
│ │ ├── SchedulerAspect.java
│ │ ├── StompSendToAspect.java
│ │ ├── StompMessageMappingAspect.java
│ │ └── KafkaListenerAspect.java
│ │ ├── SpringConfigProfiling.java
│ │ └── ByteBuddyAgentInitializer.java
└── pom.xml
├── src
└── main
│ └── java
│ └── io
│ └── bitdive
│ └── parent
│ ├── parserConfig
│ ├── LogLevelEnum.java
│ ├── ConfigForServiceDTO.java
│ ├── DefaultMonitoringValues.java
│ ├── HttpsURLConnectionCustom.java
│ └── ProfilingConfig.java
│ ├── utils
│ ├── LibraryVersionBitDive.java
│ ├── hibernateConfig
│ │ ├── HibernateVersionDetector.java
│ │ └── HibernateModuleLoader.java
│ ├── Pair.java
│ ├── MethodTypeEnum.java
│ └── ByteBuddyConfigLoader.java
│ ├── dto
│ ├── ParamMethodDto.java
│ └── TraceMethodContext.java
│ ├── anotations
│ ├── MonitoringClass.java
│ ├── NotMonitoring.java
│ ├── NotMonitoringParamsClass.java
│ └── NotMonitoringParamsField.java
│ ├── trasirovka
│ └── agent
│ │ ├── utils
│ │ ├── KafkaAgentStorage.java
│ │ ├── MessageTypeEnum.java
│ │ ├── ContextCallableCustom.java
│ │ ├── objectMaperConfig
│ │ │ ├── StreamPlaceholderSerializer.java
│ │ │ ├── CollectionSizeLimiter.java
│ │ │ ├── LimitedCollectionSerializer.java
│ │ │ ├── PackageBasedSerializerModifier.java
│ │ │ ├── MaskingFilter.java
│ │ │ └── FlowDataToPlaceholderModule.java
│ │ ├── ContextRunnableCustom.java
│ │ ├── LoggerStatusContent.java
│ │ ├── SQLUtils.java
│ │ ├── CallableStatementParser.java
│ │ └── RestUtils.java
│ │ └── byte_buddy_agent
│ │ ├── ByteBuddyAgentThreadCreator.java
│ │ ├── ByteBuddyAgentThread.java
│ │ ├── db
│ │ └── ByteBuddyAgentSqlDriver.java
│ │ ├── KafkaConsumerAgent.java
│ │ ├── ByteBuddyAgentCoyoteInputStream.java
│ │ ├── ByteBuddyAgentCatalinaResponse.java
│ │ ├── ByteBuddySimpleClientHttpResponse.java
│ │ ├── ByteBuddyAgentSpringRawWs.java
│ │ └── ByteBuddyAgentKafkaInterceptor.java
│ ├── message_producer
│ ├── PemUtils.java
│ ├── LocalCryptoService.java
│ ├── HttpURLConnectionCustom.java
│ ├── HttpsURLConnectionCustom.java
│ └── LibraryLoggerConfig.java
│ ├── init
│ └── MonitoringStarting.java
│ └── safety_config
│ ├── VaultGettingConfig.java
│ └── SSLContextCustomBitDive.java
├── .idea
├── codeStyles
│ ├── codeStyleConfig.xml
│ └── Project.xml
├── vcs.xml
├── .gitignore
├── inspectionProfiles
│ └── Project_Default.xml
├── misc.xml
└── encodings.xml
├── LICENSE
├── .gitignore
├── README.md
└── dependency-reduced-pom.xml
/perf-monitoring-producer-spring-2.7/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:
--------------------------------------------------------------------------------
1 | io.bitdive.SpringConfigProfiling
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:
--------------------------------------------------------------------------------
1 | io.bitdive.SpringConfigProfiling
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/parserConfig/LogLevelEnum.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.parserConfig;
2 |
3 | public enum LogLevelEnum {
4 | ERRORS,INFO,DEBUG
5 | }
6 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-3/src/main/resources/config-profiling-default.yml:
--------------------------------------------------------------------------------
1 | application:
2 | moduleName: module1
3 | serviceName: config-profiling
4 | packedScanner: [ default ]
5 |
6 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-2.7/src/main/resources/config-profiling-default.yml:
--------------------------------------------------------------------------------
1 | application:
2 | moduleName: module1
3 | serviceName: config-profiling
4 | packedScanner: [ default ]
5 |
6 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/utils/LibraryVersionBitDive.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.utils;
2 |
3 |
4 | public class LibraryVersionBitDive {
5 | public static final String version = "1.3.4";
6 | }
7 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-2.7/src/main/resources/META-INF/spring.factories:
--------------------------------------------------------------------------------
1 | org.springframework.context.ApplicationContextInitializer=\
2 | io.bitdive.ByteBuddyAgentInitializer
3 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
4 | io.bitdive.SpringConfigProfiling
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-3/src/main/resources/META-INF/spring.factories:
--------------------------------------------------------------------------------
1 | org.springframework.context.ApplicationContextInitializer=\
2 | io.bitdive.ByteBuddyAgentInitializer
3 |
4 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
5 | io.bitdive.SpringConfigProfiling
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-3/src/main/java/io/bitdive/jvm_metrics/MeasurementDto.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.jvm_metrics;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 |
7 | @Getter
8 | @Setter
9 | @AllArgsConstructor
10 | public class MeasurementDto {
11 | private String statistic;
12 | private double value;
13 | }
14 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-2.7/src/main/java/io/bitdive/jvm_metrics/MeasurementDto.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.jvm_metrics;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 |
7 | @Getter
8 | @Setter
9 | @AllArgsConstructor
10 | public class MeasurementDto {
11 | private String statistic;
12 | private double value;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/dto/ParamMethodDto.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.dto;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 |
7 | @Getter
8 | @AllArgsConstructor
9 | @NoArgsConstructor
10 | public class ParamMethodDto {
11 | private int parIndex;
12 | private String paramType;
13 | private Object val;
14 | }
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-2.7/src/main/java/io/bitdive/jvm_metrics/MetricDto.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.jvm_metrics;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 |
6 | import java.util.ArrayList;
7 | import java.util.List;
8 |
9 | @Getter
10 | @Setter
11 | public class MetricDto {
12 | private String name;
13 | private List measurements = new ArrayList<>();
14 | }
15 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-3/src/main/java/io/bitdive/jvm_metrics/MetricDto.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.jvm_metrics;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 |
6 | import java.util.ArrayList;
7 | import java.util.List;
8 |
9 | @Getter
10 | @Setter
11 | public class MetricDto {
12 | private String name;
13 | private List measurements = new ArrayList<>();
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/anotations/MonitoringClass.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.anotations;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | @Retention(RetentionPolicy.RUNTIME)
9 | @Target({ElementType.TYPE, ElementType.METHOD})
10 | public @interface MonitoringClass {
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/anotations/NotMonitoring.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.anotations;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | @Retention(RetentionPolicy.RUNTIME)
9 | @Target({ElementType.TYPE, ElementType.METHOD})
10 | public @interface NotMonitoring {
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/utils/KafkaAgentStorage.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.utils;
2 |
3 |
4 | import java.util.Optional;
5 |
6 | public class KafkaAgentStorage {
7 | public static String KAFKA_BOOTSTRAP_PRODUCER_STRING;
8 | public static String KAFKA_BOOTSTRAP_CONSUMER_STRING;
9 |
10 | public static String getBootstrap() {
11 | return Optional.ofNullable(KAFKA_BOOTSTRAP_PRODUCER_STRING)
12 | .orElse(KAFKA_BOOTSTRAP_CONSUMER_STRING);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Elastic License 2.0
2 |
3 | This project is licensed under the Elastic License 2.0.
4 |
5 | You may use this software in compliance with the Elastic License 2.0.
6 | You may obtain a copy of the License at
7 |
8 | https://www.elastic.co/licensing/elastic-license
9 |
10 | Software distributed under this license is distributed on an "AS IS" basis,
11 | without warranties or conditions of any kind, either express or implied.
12 | See the Elastic License 2.0 for the specific language governing permissions and limitations under the License.
13 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/parserConfig/ConfigForServiceDTO.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.parserConfig;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 |
8 | import java.util.List;
9 |
10 | @Getter
11 | @Setter
12 | @NoArgsConstructor
13 | @AllArgsConstructor
14 | public class ConfigForServiceDTO {
15 | private String moduleName;
16 | private String serviceName;
17 | private List packedScanner;
18 | private String serverUrl;
19 | private String token;
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/utils/hibernateConfig/HibernateVersionDetector.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.utils.hibernateConfig;
2 |
3 | public class HibernateVersionDetector {
4 | public static Integer getHibernateMajorVersion() {
5 | try {
6 | Class> versionClass = Class.forName("org.hibernate.Version");
7 | String version = (String) versionClass.getDeclaredMethod("getVersionString").invoke(null);
8 | return Integer.parseInt(version.split("\\.")[0]);
9 | } catch (Exception e) {
10 | return null;
11 | }
12 | }
13 | }
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-3/src/main/java/io/bitdive/aspect/YamlParserCondition.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.aspect;
2 |
3 | import io.bitdive.parent.parserConfig.YamlParserConfig;
4 | import org.springframework.context.annotation.Condition;
5 | import org.springframework.context.annotation.ConditionContext;
6 | import org.springframework.core.type.AnnotatedTypeMetadata;
7 |
8 | public class YamlParserCondition implements Condition {
9 | @Override
10 | public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
11 | return YamlParserConfig.isWork();
12 | }
13 | }
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-2.7/src/main/java/io/bitdive/aspect/YamlParserCondition.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.aspect;
2 |
3 | import io.bitdive.parent.parserConfig.YamlParserConfig;
4 | import org.springframework.context.annotation.Condition;
5 | import org.springframework.context.annotation.ConditionContext;
6 | import org.springframework.core.type.AnnotatedTypeMetadata;
7 |
8 | public class YamlParserCondition implements Condition {
9 | @Override
10 | public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
11 | return YamlParserConfig.isWork();
12 | }
13 | }
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/utils/Pair.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.utils;
2 |
3 | public class Pair {
4 |
5 | private final K element0;
6 | private final V element1;
7 |
8 | public static Pair createPair(K element0, V element1) {
9 | return new Pair(element0, element1);
10 | }
11 |
12 | public Pair(K element0, V element1) {
13 | this.element0 = element0;
14 | this.element1 = element1;
15 | }
16 |
17 | public K getKey() {
18 | return element0;
19 | }
20 |
21 | public V getVal() {
22 | return element1;
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 | !**/src/main/**/target/
4 | !**/src/test/**/target/
5 |
6 | ### IntelliJ IDEA ###
7 | .idea/modules.xml
8 | .idea/jarRepositories.xml
9 | .idea/compiler.xml
10 | .idea/libraries/
11 | *.iws
12 | *.iml
13 | *.ipr
14 |
15 | ### Eclipse ###
16 | .apt_generated
17 | .classpath
18 | .factorypath
19 | .project
20 | .settings
21 | .springBeans
22 | .sts4-cache
23 |
24 | ### NetBeans ###
25 | /nbproject/private/
26 | /nbbuild/
27 | /dist/
28 | /nbdist/
29 | /.nb-gradle/
30 | build/
31 | !**/src/main/**/build/
32 | !**/src/test/**/build/
33 |
34 | ### VS Code ###
35 | .vscode/
36 |
37 | ### Mac OS ###
38 | .DS_Store
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/anotations/NotMonitoringParamsClass.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.anotations;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * Annotation on the indications of class whose values must be masked during serialization.
10 | */
11 | @Retention(RetentionPolicy.RUNTIME)
12 | @Target({ElementType.TYPE})
13 | public @interface NotMonitoringParamsClass {
14 | /**
15 | * A string that will be used to replace the field value during serialization.
16 | * The default is "*****".
17 | */
18 | String value() default "*****";
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/anotations/NotMonitoringParamsField.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.anotations;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * Annotation on the indications of fields whose values must be masked during serialization.
10 | */
11 | @Retention(RetentionPolicy.RUNTIME)
12 | @Target({ElementType.FIELD})
13 | public @interface NotMonitoringParamsField {
14 | /**
15 | * A string that will be used to replace the field value during serialization.
16 | * The default is "*****".
17 | */
18 | String value() default "*****";
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/utils/MessageTypeEnum.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.utils;
2 |
3 | public enum MessageTypeEnum {
4 | STAR,
5 | END,
6 | SQL_START,
7 | SQL_END,
8 | WEB_RESPONSE,
9 | WEB_REQUEST,
10 | CRITICAL_DB_ERROR,
11 | CRITICAL_KAFKA_ERROR,
12 | KAFKA_SEND,
13 | KAFKA_CONSUMER,
14 |
15 | STOMP_SEND,
16 | STOMP_CONSUMER,
17 |
18 | RAW_WS_CONSUMER,
19 |
20 | CASSANDRA_DB_START,
21 | CASSANDRA_DB_END,
22 |
23 | MONGO_DB_START,
24 | MONGO_DB_END,
25 |
26 | REDIS_DB_START,
27 | REDIS_DB_END,
28 |
29 | NEO4J_DB_START,
30 | NEO4J_DB_END,
31 |
32 | SOAP_START,
33 | SOAP_END,
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/utils/ContextCallableCustom.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.utils;
2 |
3 | import io.bitdive.parent.dto.TraceMethodContext;
4 |
5 | import java.util.concurrent.Callable;
6 |
7 | public class ContextCallableCustom implements Callable {
8 | private final Callable originalCallable;
9 | private final TraceMethodContext context;
10 |
11 | public ContextCallableCustom(Callable originalCallable, TraceMethodContext context) {
12 | this.originalCallable = originalCallable;
13 | this.context = context;
14 | }
15 |
16 | @Override
17 | public V call() throws Exception {
18 | ContextManager.setContextThread(context);
19 | return originalCallable.call();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/utils/objectMaperConfig/StreamPlaceholderSerializer.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.utils.objectMaperConfig;
2 |
3 | import com.fasterxml.jackson.core.JsonGenerator;
4 | import com.fasterxml.jackson.databind.SerializerProvider;
5 | import com.fasterxml.jackson.databind.ser.std.StdSerializer;
6 |
7 | import java.io.IOException;
8 | import java.util.stream.Stream;
9 |
10 | public final class StreamPlaceholderSerializer extends StdSerializer {
11 |
12 | public StreamPlaceholderSerializer() {
13 | super(Stream.class); // handledType = Stream.class
14 | }
15 |
16 | @Override
17 | public void serialize(Stream value,
18 | JsonGenerator gen,
19 | SerializerProvider provider) throws IOException {
20 | gen.writeString("[stream]");
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/utils/ContextRunnableCustom.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.utils;
2 |
3 | import io.bitdive.parent.dto.TraceMethodContext;
4 |
5 | public class ContextRunnableCustom implements Runnable {
6 | private final Runnable originalRunnable;
7 | private final TraceMethodContext context;
8 |
9 | public ContextRunnableCustom(Runnable originalRunnable, TraceMethodContext context) {
10 | this.originalRunnable = originalRunnable;
11 | this.context = context;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | TraceMethodContext oldContext = ContextManager.getContext();
17 | try {
18 | ContextManager.setContextThread(context);
19 | originalRunnable.run();
20 | } finally {
21 | ContextManager.setContextThread(oldContext);
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/utils/MethodTypeEnum.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.utils;
2 |
3 | import lombok.Getter;
4 |
5 | import java.util.Arrays;
6 | import java.util.List;
7 |
8 | @Getter
9 | public enum MethodTypeEnum {
10 | DB("Repository"),
11 |
12 | SCHEDULER("Scheduled"),
13 |
14 | WEB_GET("GetMapping"),
15 | WEB_POST("PostMapping"),
16 | WEB_PUT("PutMapping"),
17 | WEB_DELETE("DeleteMapping"),
18 | WEB_PATCH("PatchMapping"),
19 | METHOD("");
20 |
21 | final String annotationName;
22 |
23 | MethodTypeEnum(String annotationName) {
24 | this.annotationName = annotationName;
25 | }
26 |
27 | public static List getListWebMethodType() {
28 | return Arrays.asList(WEB_GET, WEB_POST, WEB_PUT, WEB_DELETE, WEB_PATCH);
29 | }
30 |
31 | public static List getListMethodFlagInPoint() {
32 | return Arrays.asList(WEB_GET, WEB_POST, WEB_PUT, WEB_DELETE, WEB_PATCH, SCHEDULER);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-2.7/src/main/resources/META-INF/spring-configuration-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "properties": [
3 | {
4 | "name": "bitdive.monitoring.moduleName",
5 | "type": "java.lang.String",
6 | "description": "name module",
7 | "sourceType": "com.your.package.MonitoringProperties"
8 | },
9 | {
10 | "name": "bitdive.monitoring.serviceName",
11 | "type": "java.lang.String",
12 | "description": "name service",
13 | "sourceType": "com.your.package.MonitoringProperties"
14 | },
15 | {
16 | "name": "bitdive.monitoring.packedScanner",
17 | "type": "java.util.List",
18 | "description": "packed for scanner",
19 | "sourceType": "com.your.package.MonitoringProperties"
20 | },
21 | {
22 | "name": "bitdive.monitoring.server-url",
23 | "type": "java.lang.String",
24 | "description": "URL server",
25 | "sourceType": "com.your.package.MonitoringProperties"
26 | },
27 | {
28 | "name": "bitdive.monitoring.token",
29 | "type": "java.lang.String",
30 | "description": "token for authorization",
31 | "sourceType": "com.your.package.MonitoringProperties"
32 | }
33 | ]
34 | }
35 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-3/src/main/resources/META-INF/spring-configuration-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "properties": [
3 | {
4 | "name": "bitdive.monitoring.moduleName",
5 | "type": "java.lang.String",
6 | "description": "name module",
7 | "sourceType": "com.your.package.MonitoringProperties"
8 | },
9 | {
10 | "name": "bitdive.monitoring.serviceName",
11 | "type": "java.lang.String",
12 | "description": "name service",
13 | "sourceType": "com.your.package.MonitoringProperties"
14 | },
15 | {
16 | "name": "bitdive.monitoring.packedScanner",
17 | "type": "java.util.List",
18 | "description": "packed for scanner",
19 | "sourceType": "com.your.package.MonitoringProperties"
20 | },
21 | {
22 | "name": "bitdive.monitoring.server-url",
23 | "type": "java.lang.String",
24 | "description": "URL server",
25 | "sourceType": "com.your.package.MonitoringProperties"
26 | },
27 | {
28 | "name": "bitdive.monitoring.token",
29 | "type": "java.lang.String",
30 | "description": "token for authorization",
31 | "sourceType": "com.your.package.MonitoringProperties"
32 | }
33 | ]
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/utils/objectMaperConfig/CollectionSizeLimiter.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.utils.objectMaperConfig;
2 |
3 | import com.fasterxml.jackson.databind.BeanDescription;
4 | import com.fasterxml.jackson.databind.JsonSerializer;
5 | import com.fasterxml.jackson.databind.SerializationConfig;
6 | import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
7 |
8 | import java.util.Collection;
9 |
10 | public class CollectionSizeLimiter extends BeanSerializerModifier {
11 | private final int maxElements;
12 | private final String messageMaxElements;
13 |
14 | public CollectionSizeLimiter(int maxElements, String messageMaxElements) {
15 | this.maxElements = maxElements;
16 | this.messageMaxElements = messageMaxElements;
17 | }
18 |
19 | @Override
20 | public JsonSerializer> modifySerializer(SerializationConfig config,
21 | BeanDescription beanDesc,
22 | JsonSerializer> serializer) {
23 | if (Collection.class.isAssignableFrom(beanDesc.getBeanClass())) {
24 | return new LimitedCollectionSerializer(maxElements, messageMaxElements);
25 | }
26 | return serializer;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/dto/TraceMethodContext.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.dto;
2 |
3 | import com.github.f4b6a3.uuid.UuidCreator;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 |
7 | import java.util.List;
8 | import java.util.Map;
9 | import java.util.concurrent.BlockingDeque;
10 | import java.util.concurrent.LinkedBlockingDeque;
11 |
12 | @Getter
13 | @Setter
14 | public class TraceMethodContext {
15 | public TraceMethodContext() {
16 | traceId = UuidCreator.getTimeBased().toString();
17 | spanId = UuidCreator.getTimeBased().toString();
18 | startMessageId = UuidCreator.getTimeBased().toString();
19 |
20 | methodCallContextQueue = new LinkedBlockingDeque<>();
21 | parentIdForRest = null;
22 |
23 | }
24 | private BlockingDeque methodCallContextQueue;
25 | private String traceId;
26 | private String spanId;
27 |
28 | private String serviceCallId;
29 |
30 | private String parentIdForRest;
31 |
32 | private String startMessageId;
33 | private String urlStart;
34 |
35 |
36 | private String classInpointName;
37 | private String methodInpointName;
38 | private String messageInpointId;
39 |
40 | // Incoming HTTP request capture (server side)
41 | private Map> requestHeaders;
42 | private byte[] requestBodyBytes;
43 | }
44 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/utils/ByteBuddyConfigLoader.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.utils;
2 |
3 | import com.fasterxml.jackson.databind.ObjectMapper;
4 | import io.bitdive.parent.parserConfig.ConfigForServiceDTO;
5 | import org.yaml.snakeyaml.Yaml;
6 |
7 | import java.io.InputStream;
8 | import java.util.Map;
9 |
10 | public class ByteBuddyConfigLoader {
11 |
12 | public static ConfigForServiceDTO load() {
13 | try {
14 | return readYaml();
15 | } catch (Exception e) {
16 | return null;
17 | }
18 | }
19 |
20 | private static ConfigForServiceDTO readYaml() {
21 | try (InputStream in = ByteBuddyConfigLoader.class
22 | .getClassLoader()
23 | .getResourceAsStream("config-profiling-api.yml")) {
24 |
25 | if (in == null) {
26 | throw new IllegalStateException("Файл config-profiling-api.yml не найден");
27 | }
28 |
29 | Yaml yaml = new Yaml();
30 | Map root = yaml.load(in);
31 |
32 | Map monitoring = (Map) ((Map) root.get("bitdive")).get("monitoring");
33 |
34 | ObjectMapper mapper = new ObjectMapper();
35 | return mapper.convertValue(monitoring, ConfigForServiceDTO.class);
36 |
37 | } catch (Exception e) {
38 | throw new RuntimeException("Ошибка чтения YAML", e);
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/utils/objectMaperConfig/LimitedCollectionSerializer.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.utils.objectMaperConfig;
2 |
3 | import com.fasterxml.jackson.core.JsonGenerator;
4 | import com.fasterxml.jackson.databind.JsonSerializer;
5 | import com.fasterxml.jackson.databind.SerializerProvider;
6 |
7 | import java.io.IOException;
8 | import java.util.Collection;
9 |
10 | public class LimitedCollectionSerializer extends JsonSerializer> {
11 | private final int maxElements;
12 | private final String messageMaxElements;
13 |
14 | public LimitedCollectionSerializer(int maxElements, String messageMaxElements) {
15 | this.maxElements = maxElements;
16 | this.messageMaxElements = messageMaxElements;
17 | }
18 |
19 | @Override
20 | public void serialize(Collection> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
21 | gen.writeStartArray();
22 | int count = 0;
23 | for (Object elem : value) {
24 | if (count < maxElements) {
25 | // Сериализуем элемент стандартным способом
26 | serializers.defaultSerializeValue(elem, gen);
27 | } else if (count == maxElements) {
28 | // Вместо следующих элементов записываем сообщение и выходим
29 | gen.writeString(this.messageMaxElements);
30 | break;
31 | }
32 | count++;
33 | }
34 | gen.writeEndArray();
35 | }
36 | }
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/utils/hibernateConfig/HibernateModuleLoader.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.utils.hibernateConfig;
2 |
3 | import com.fasterxml.jackson.databind.Module;
4 |
5 | public class HibernateModuleLoader {
6 | public static Module registerHibernateModule() {
7 | try {
8 | Integer majorVersion = HibernateVersionDetector.getHibernateMajorVersion();
9 | if (majorVersion == null) {
10 | return null;
11 | }
12 |
13 | if (loadTransientAnnotation(majorVersion) == null) {
14 | return null;
15 | }
16 |
17 | String moduleClassName = (majorVersion >= 6)
18 | ? "com.fasterxml.jackson.datatype.hibernate6.Hibernate6Module"
19 | : "com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module";
20 | Class> moduleClass = Class.forName(moduleClassName);
21 | return (com.fasterxml.jackson.databind.Module) moduleClass.getDeclaredConstructor().newInstance();
22 | } catch (Exception e) {
23 | return null;
24 | }
25 | }
26 |
27 | public static Class> loadTransientAnnotation(int hibernateMajorVersion) {
28 | String className = (hibernateMajorVersion >= 6)
29 | ? "jakarta.persistence.Transient"
30 | : "javax.persistence.Transient";
31 | try {
32 | return Class.forName(className);
33 | } catch (ClassNotFoundException e) {
34 | return null;
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-2.7/src/main/java/io/bitdive/jvm_metrics/MetricsCollector.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.jvm_metrics;
2 |
3 | import io.micrometer.core.instrument.Measurement;
4 | import io.micrometer.core.instrument.Meter;
5 | import io.micrometer.core.instrument.MeterRegistry;
6 | import lombok.Getter;
7 | import lombok.Setter;
8 |
9 | import java.time.OffsetDateTime;
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | @Setter
14 | @Getter
15 | public class MetricsCollector {
16 |
17 | private String moduleName;
18 | private String serviceName;
19 | private OffsetDateTime createdMetric;
20 | private String serviceNodeUUID;
21 | private List listOfMetrics;
22 |
23 | public MetricsCollector(MeterRegistry meterRegistry) {
24 | listOfMetrics = collectMetrics(meterRegistry);
25 | }
26 |
27 |
28 | private List collectMetrics(MeterRegistry meterRegistry) {
29 | List metricsDtoList = new ArrayList<>();
30 | for (Meter meter : meterRegistry.getMeters()) {
31 | MetricDto dto = new MetricDto();
32 |
33 | dto.setName(meter.getId().getName());
34 |
35 | for (Measurement measurement : meter.measure()) {
36 | String statistic = measurement.getStatistic().name();
37 | double value = measurement.getValue();
38 | dto.getMeasurements().add(new MeasurementDto(statistic, value));
39 | }
40 |
41 | metricsDtoList.add(dto);
42 | }
43 | return metricsDtoList;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/perf-monitoring-producer-spring-3/src/main/java/io/bitdive/jvm_metrics/MetricsCollector.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.jvm_metrics;
2 |
3 | import io.micrometer.core.instrument.Measurement;
4 | import io.micrometer.core.instrument.Meter;
5 | import io.micrometer.core.instrument.MeterRegistry;
6 | import lombok.Getter;
7 | import lombok.Setter;
8 |
9 | import java.time.OffsetDateTime;
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | @Setter
14 | @Getter
15 | public class MetricsCollector {
16 |
17 | private String moduleName;
18 | private String serviceName;
19 | private OffsetDateTime createdMetric;
20 | private String serviceNodeUUID;
21 | private List listOfMetrics;
22 |
23 | public MetricsCollector(MeterRegistry meterRegistry) {
24 | listOfMetrics = collectMetrics(meterRegistry);
25 | }
26 |
27 |
28 | private List collectMetrics(MeterRegistry meterRegistry) {
29 | List metricsDtoList = new ArrayList<>();
30 | for (Meter meter : meterRegistry.getMeters()) {
31 | MetricDto dto = new MetricDto();
32 |
33 | dto.setName(meter.getId().getName());
34 |
35 | for (Measurement measurement : meter.measure()) {
36 | String statistic = measurement.getStatistic().name();
37 | double value = measurement.getValue();
38 | dto.getMeasurements().add(new MeasurementDto(statistic, value));
39 | }
40 |
41 | metricsDtoList.add(dto);
42 | }
43 | return metricsDtoList;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/byte_buddy_agent/ByteBuddyAgentThreadCreator.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.byte_buddy_agent;
2 |
3 | import io.bitdive.parent.trasirovka.agent.utils.ContextManager;
4 | import io.bitdive.parent.trasirovka.agent.utils.ContextRunnableCustom;
5 | import net.bytebuddy.agent.builder.AgentBuilder;
6 | import net.bytebuddy.agent.builder.ResettableClassFileTransformer;
7 | import net.bytebuddy.asm.Advice;
8 | import net.bytebuddy.matcher.ElementMatchers;
9 |
10 | import java.lang.instrument.Instrumentation;
11 | import java.lang.reflect.Method;
12 |
13 | public class ByteBuddyAgentThreadCreator {
14 | public static ResettableClassFileTransformer init(Instrumentation instrumentation) {
15 | return new AgentBuilder.Default()
16 | .type(ElementMatchers.nameStartsWith("org.springframework.util.CustomizableThreadCreator")) // Укажите пакет ваших классов
17 | .transform((builder, typeDescription, classLoader, module, sd) ->
18 | builder.method(ElementMatchers.named("createThread")) // Выбор всех методов для обертки
19 | .intercept(Advice.to(ThreadCreatorInterceptor.class))
20 | ).installOn(instrumentation);
21 | }
22 |
23 | public static class ThreadCreatorInterceptor {
24 | @Advice.OnMethodEnter
25 | public static void onMethodEnter(@Advice.Origin Method method,
26 | @Advice.Argument(value = 0, readOnly = false) Runnable runnable) {
27 | runnable = new ContextRunnableCustom(runnable, ContextManager.getContext());
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/utils/LoggerStatusContent.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.utils;
2 |
3 |
4 | import io.bitdive.parent.parserConfig.LogLevelEnum;
5 | import io.bitdive.parent.parserConfig.ProfilingConfig;
6 | import io.bitdive.parent.parserConfig.YamlParserConfig;
7 |
8 | import java.util.Arrays;
9 | import java.util.Optional;
10 |
11 | public class LoggerStatusContent {
12 |
13 | public static boolean getEnabledProfile() {
14 | return
15 | Optional.ofNullable(YamlParserConfig.getProfilingConfig())
16 | .map(ProfilingConfig::getMonitoring)
17 | .map(monitoringConfig -> !monitoringConfig.isEnabled())
18 | .orElse(true);
19 | }
20 |
21 | public static boolean isErrorsOrDebug(){
22 | if (getEnabledProfile()) return false;
23 | return Arrays.asList(LogLevelEnum.ERRORS, LogLevelEnum.DEBUG).contains(
24 | Optional.ofNullable(YamlParserConfig.getProfilingConfig())
25 | .map(ProfilingConfig::getMonitoring)
26 | .map(ProfilingConfig.MonitoringConfig::getLogLevel).orElse(LogLevelEnum.INFO)
27 |
28 | );
29 | }
30 |
31 | public static boolean isErrors (){
32 | if (getEnabledProfile()) return false;
33 | return YamlParserConfig.getProfilingConfig().getMonitoring().getLogLevel()==LogLevelEnum.ERRORS;
34 | }
35 |
36 | public static boolean isInfo (){
37 | if (getEnabledProfile()) return false;
38 | return YamlParserConfig.getProfilingConfig().getMonitoring().getLogLevel()==LogLevelEnum.INFO;
39 | }
40 | public static boolean isDebug (){
41 | if (getEnabledProfile()) return false;
42 | return YamlParserConfig.getProfilingConfig().getMonitoring().getLogLevel()==LogLevelEnum.DEBUG;
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/byte_buddy_agent/ByteBuddyAgentThread.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.byte_buddy_agent;
2 |
3 | import io.bitdive.parent.dto.TraceMethodContext;
4 | import io.bitdive.parent.trasirovka.agent.utils.ContextCallableCustom;
5 | import io.bitdive.parent.trasirovka.agent.utils.ContextManager;
6 | import net.bytebuddy.agent.builder.AgentBuilder;
7 | import net.bytebuddy.agent.builder.ResettableClassFileTransformer;
8 | import net.bytebuddy.asm.Advice;
9 | import net.bytebuddy.matcher.ElementMatchers;
10 |
11 | import java.lang.instrument.Instrumentation;
12 | import java.util.concurrent.Callable;
13 |
14 | public class ByteBuddyAgentThread {
15 | public static ResettableClassFileTransformer init(Instrumentation instrumentation) {
16 | return new AgentBuilder.Default()
17 | .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
18 | .with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE)
19 | .type(ElementMatchers.nameStartsWith("org.springframework.util.concurrent.FutureUtils"))
20 | .transform((builder, typeDescription, classLoader, module, sdf) ->
21 | builder.method(ElementMatchers.named("callAsync").and(ElementMatchers.takesArguments(2)))
22 | .intercept(Advice.to(ThreadInterceptor.class))
23 | ).installOn(instrumentation);
24 | }
25 |
26 | public static class ThreadInterceptor {
27 | @Advice.OnMethodEnter
28 | public static void onEnter(
29 | @Advice.Origin String method,
30 | @Advice.Argument(value = 0, readOnly = false) Callable> callable) {
31 |
32 | TraceMethodContext currentContext = ContextManager.getContext();
33 | callable = new ContextCallableCustom<>(callable, currentContext);
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/message_producer/PemUtils.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.message_producer;
2 |
3 | import lombok.SneakyThrows;
4 | import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
5 | import org.bouncycastle.asn1.sec.ECPrivateKey;
6 | import org.bouncycastle.jce.provider.BouncyCastleProvider;
7 | import org.bouncycastle.openssl.PEMKeyPair;
8 | import org.bouncycastle.openssl.PEMParser;
9 |
10 | import java.io.StringReader;
11 | import java.security.KeyFactory;
12 | import java.security.PrivateKey;
13 | import java.security.Security;
14 | import java.security.spec.PKCS8EncodedKeySpec;
15 |
16 | public class PemUtils {
17 | @SneakyThrows
18 | public static PrivateKey getPrivateKeyFromPEM(String pem) {
19 | Security.addProvider(new BouncyCastleProvider());
20 | PEMParser pemParser = new PEMParser(new StringReader(pem));
21 | Object object = pemParser.readObject();
22 | pemParser.close();
23 | PrivateKeyInfo pkInfo;
24 | if (object instanceof PEMKeyPair) {
25 | pkInfo = ((PEMKeyPair) object).getPrivateKeyInfo();
26 | } else if (object instanceof PrivateKeyInfo) {
27 | pkInfo = (PrivateKeyInfo) object;
28 | } else if (object instanceof ECPrivateKey) {
29 | ECPrivateKey ecPrivateKey = (ECPrivateKey) object;
30 | pkInfo = new PrivateKeyInfo(new org.bouncycastle.asn1.x509.AlgorithmIdentifier(
31 | org.bouncycastle.asn1.x9.X9ObjectIdentifiers.id_ecPublicKey), ecPrivateKey);
32 | } else {
33 | throw new IllegalArgumentException("Неподдерживаемый тип PEM-объекта: " + object.getClass().getName());
34 | }
35 |
36 | byte[] pkcs8Bytes = pkInfo.getEncoded();
37 | PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8Bytes);
38 | KeyFactory kf = KeyFactory.getInstance("EC", "BC");
39 | return kf.generatePrivate(keySpec);
40 | }
41 | }
42 |
43 |
--------------------------------------------------------------------------------
/src/main/java/io/bitdive/parent/trasirovka/agent/utils/objectMaperConfig/PackageBasedSerializerModifier.java:
--------------------------------------------------------------------------------
1 | package io.bitdive.parent.trasirovka.agent.utils.objectMaperConfig;
2 |
3 | import com.fasterxml.jackson.core.JsonGenerator;
4 | import com.fasterxml.jackson.databind.BeanDescription;
5 | import com.fasterxml.jackson.databind.JsonSerializer;
6 | import com.fasterxml.jackson.databind.SerializationConfig;
7 | import com.fasterxml.jackson.databind.SerializerProvider;
8 | import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
9 |
10 | import java.io.IOException;
11 | import java.util.Optional;
12 |
13 | public class PackageBasedSerializerModifier extends BeanSerializerModifier {
14 |
15 | private final String[] excludedPackages;
16 |
17 | public PackageBasedSerializerModifier(String... excludedPackages) {
18 | this.excludedPackages = excludedPackages;
19 | }
20 |
21 | @Override
22 | public JsonSerializer> modifySerializer(SerializationConfig config,
23 | BeanDescription beanDesc,
24 | JsonSerializer> serializer) {
25 | String packageName =
26 | Optional.ofNullable(beanDesc.getBeanClass())
27 | .map(Class::getPackage)
28 | .map(Package::getName).orElse(null);
29 |
30 | if (packageName == null) {
31 | return serializer;
32 | }
33 |
34 | for (String excludedPackage : excludedPackages) {
35 | if (packageName.startsWith(excludedPackage)) {
36 | return new JsonSerializer