From 3d1a428a38119235711a42772fc87ad414a948e6 Mon Sep 17 00:00:00 2001 From: Roni Dover Date: Tue, 21 May 2024 14:11:50 -0700 Subject: [PATCH] updates --- docker-compose.override.otel.yml | 2 +- pom.xml | 4 ++ response.json | 1 + .../samples/petclinic/config/RedisConfig.java | 58 ++++++++++++++++++- 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 response.json diff --git a/docker-compose.override.otel.yml b/docker-compose.override.otel.yml index 0117c1d1e..35cd7c22a 100644 --- a/docker-compose.override.otel.yml +++ b/docker-compose.override.otel.yml @@ -1,4 +1,4 @@ -version: '3' + version: '3' services: diff --git a/pom.xml b/pom.xml index 323a12e55..2c97435cd 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,10 @@ org.springframework.kafka spring-kafka + + org.springframework.boot + spring-boot-starter-data-redis + org.springframework.boot spring-boot-testcontainers diff --git a/response.json b/response.json new file mode 100644 index 000000000..2c694c341 --- /dev/null +++ b/response.json @@ -0,0 +1 @@ +{"totalCount":5,"dismissedCount":0,"insights":[{"name":"N+1","type":"SpaNPlusOne","category":"Performance","specifity":2,"importance":2,"isRecalculateEnabled":true,"span":{"name":"5C4D22A699D3A551E2AFFA4FA0B3BF","displayName":"select p1_0.owner_id,p1_0.id,p1_0.birth_date,p1_0.name,t1_0.id,t1_0.name,v1_0.pet_id,v1_0.id,v1_0.visit_date,v1_0.description from pets p1_0 left join types t1_0 on t1_0.id=p1_0.type_id left join visits v1_0 on p1_0.id=v1_0.pet_id where p1_0.owner_id=? order by v1_0.visit_date,p1_0.name","instrumentationLibrary":"io.opentelemetry.jdbc","spanCodeObjectId":"span:io.opentelemetry.jdbc$_$5C4D22A699D3A551E2AFFA4FA0B3BF","methodCodeObjectId":null,"kind":"Client","codeObjectId":null},"clientSpanName":"select p1_0.owner_id,p1_0.id,p1_0.birth_date,p1_0.name,t1_0.id,t1_0.name,v1_0.pet_id,v1_0.id,v1_0.visit_date,v1_0.description from pets p1_0 left join types t1_0 on t1_0.id=p1_0.type_id left join visits v1_0 on p1_0.id=v1_0.pet_id where p1_0.owner_id=? order by v1_0.visit_date,p1_0.name","clientSpanCodeObjectId":"span:io.opentelemetry.jdbc$_$5C4D22A699D3A551E2AFFA4FA0B3BF","occurrences":12,"traceId":"0D5AC9F19826BF6A41CB8D15C3DAA18C","duration":{"value":6.06,"unit":"ms","raw":6060400.0},"endpoints":[{"endpointInfo":{"route":"epHTTP:HTTP GET /owners","instrumentationLibrary":"io.opentelemetry.jdbc","spanCodeObjectId":"span:io.opentelemetry.jdbc$_$5C4D22A699D3A551E2AFFA4FA0B3BF","entrySpanCodeObjectId":"span:io.opentelemetry.tomcat-10.0$_$HTTP GET /owners","serviceName":"spring-petclinic"},"occurrences":12,"traceId":"0D5AC9F19826BF6A41CB8D15C3DAA18C","duration":{"value":6.06,"unit":"ms","raw":6060400.0},"impact":0.6666666666666666,"severity":0.9342616520113537,"criticality":0.566563531670177,"commitId":null,"requestPercentage":100}],"scope":"Span","spanInfo":{"name":"5C4D22A699D3A551E2AFFA4FA0B3BF","displayName":"select p1_0.owner_id,p1_0.id,p1_0.birth_date,p1_0.name,t1_0.id,t1_0.name,v1_0.pet_id,v1_0.id,v1_0.visit_date,v1_0.description from pets p1_0 left join types t1_0 on t1_0.id=p1_0.type_id left join visits v1_0 on p1_0.id=v1_0.pet_id where p1_0.owner_id=? order by v1_0.visit_date,p1_0.name","instrumentationLibrary":"io.opentelemetry.jdbc","spanCodeObjectId":"span:io.opentelemetry.jdbc$_$5C4D22A699D3A551E2AFFA4FA0B3BF","methodCodeObjectId":null,"kind":"Client","codeObjectId":null},"id":"f14c25da-faef-11ee-a706-0689d248b915","shortDisplayInfo":{"title":"","targetDisplayName":"","subtitle":"","description":""},"codeObjectId":"io.opentelemetry.jdbc$_$5C4D22A699D3A551E2AFFA4FA0B3BF","decorators":[{"title":"N+1","description":"Suspected NPlus One"}],"environment":"PETCLINIC_CI#ID#1","severity":0.9342616520113537,"impact":0.6666666666666666,"criticality":0.566563531670177,"reopenCount":0,"ticketLink":null,"isDismissible":true,"isReadable":true,"isDismissed":false,"prefixedCodeObjectId":"span:io.opentelemetry.jdbc$_$5C4D22A699D3A551E2AFFA4FA0B3BF","customStartTime":null,"actualStartTime":"2024-04-01T07:57:57.004571Z","firstCommitId":null,"lastCommitId":null,"deactivatedCommitId":null,"sourceSpanCodeObjectInsight":"","firstDetected":"2024-04-15T06:16:58.244913Z","lastDetected":"2024-04-15T07:54:52.521914Z","status":"Active","flags":[],"isRead":false,"firstFixed":null,"lastReopen":null,"lastDeactivated":null},{"name":"Query Optimization","type":"SpanQueryOptimization","category":"Performance","specifity":4,"isRecalculateEnabled":true,"importance":5,"duration":{"value":5.46,"unit":"ms","raw":5464966.666666666},"typicalDuration":{"value":889.14,"unit":"μs","raw":889142.4126984128},"dbStatement":"select","traceId":"E4BD1902EAEC2D8D4E18B9F0BDD543FE","serviceName":null,"dbName":"test","endpoints":[],"scope":"Span","spanInfo":{"name":"CD934D8E32DA2131FDAD807A3BB5E5","displayName":"select version()","instrumentationLibrary":"io.opentelemetry.jdbc","spanCodeObjectId":"span:io.opentelemetry.jdbc$_$CD934D8E32DA2131FDAD807A3BB5E5","methodCodeObjectId":null,"kind":"Client","codeObjectId":null},"id":"85b64260-faef-11ee-84cd-0689d248b915","shortDisplayInfo":{"title":"","targetDisplayName":"","subtitle":"","description":""},"codeObjectId":"io.opentelemetry.jdbc$_$CD934D8E32DA2131FDAD807A3BB5E5","decorators":null,"environment":"PETCLINIC_CI#ID#1","severity":0.4967456139388292,"impact":0.0,"criticality":0.4967456139388292,"reopenCount":0,"ticketLink":null,"isDismissible":true,"isReadable":true,"isDismissed":false,"prefixedCodeObjectId":"span:io.opentelemetry.jdbc$_$CD934D8E32DA2131FDAD807A3BB5E5","customStartTime":null,"actualStartTime":"2024-04-01T07:53:13.94393Z","firstCommitId":null,"lastCommitId":null,"deactivatedCommitId":null,"sourceSpanCodeObjectInsight":"","firstDetected":"2024-04-15T06:15:14.218886Z","lastDetected":"2024-04-15T07:53:13.977066Z","status":"Active","flags":[],"isRead":false,"firstFixed":null,"lastReopen":null,"lastDeactivated":null},{"name":"Bottleneck","type":"SpanEndpointBottleneck","category":"Performance","specifity":3,"importance":2,"isRecalculateEnabled":true,"span":{"name":"OwnerValidation.ValidateUserAccess","displayName":"OwnerValidation.ValidateUserAccess","instrumentationLibrary":"io.opentelemetry.opentelemetry-instrumentation-annotations-1.16","spanCodeObjectId":"span:io.opentelemetry.opentelemetry-instrumentation-annotations-1.16$_$OwnerValidation.ValidateUserAccess","methodCodeObjectId":"method:org.springframework.samples.petclinic.domain.OwnerValidation$_$ValidateUserAccess","kind":null,"codeObjectId":"org.springframework.samples.petclinic.domain.OwnerValidation$_$ValidateUserAccess"},"slowEndpoints":[{"endpointInfo":{"route":"epHTTP:HTTP GET /owners","instrumentationLibrary":"io.opentelemetry.tomcat-10.0","serviceName":"spring-petclinic","codeObjectId":"org.springframework.samples.petclinic.owner.OwnerController$_$processFindForm","spanCodeObjectId":"span:io.opentelemetry.tomcat-10.0$_$HTTP GET /owners","spanName":"HTTP GET /owners"},"probabilityOfBeingBottleneck":0.5,"avgDurationWhenBeingBottleneck":{"value":781.82,"unit":"ms","raw":781823600.0},"avgFractionWhenBeingBottleneck":52.0,"impact":0.3333333333333333,"severity":0.8711572605711211,"criticality":0.48217189074494626,"requestPercentage":50,"traceId":"F72D244350DB6F3314037A1C61C3EB10"}],"p50":{"fraction":0.0,"maxDuration":{"value":0.0,"unit":"ns","raw":0.0}},"p95":{"fraction":0.0,"maxDuration":{"value":0.0,"unit":"ns","raw":0.0}},"p99":{"fraction":0.0,"maxDuration":{"value":0.0,"unit":"ns","raw":0.0}},"scope":"Span","spanInfo":{"name":"OwnerValidation.ValidateUserAccess","displayName":"OwnerValidation.ValidateUserAccess","instrumentationLibrary":"io.opentelemetry.opentelemetry-instrumentation-annotations-1.16","spanCodeObjectId":"span:io.opentelemetry.opentelemetry-instrumentation-annotations-1.16$_$OwnerValidation.ValidateUserAccess","methodCodeObjectId":"method:org.springframework.samples.petclinic.domain.OwnerValidation$_$ValidateUserAccess","kind":null,"codeObjectId":"org.springframework.samples.petclinic.domain.OwnerValidation$_$ValidateUserAccess"},"id":"ef3e92e6-faef-11ee-9352-0689d248b915","shortDisplayInfo":{"title":"","targetDisplayName":"","subtitle":"","description":""},"codeObjectId":"org.springframework.samples.petclinic.domain.OwnerValidation$_$ValidateUserAccess","decorators":[{"title":"Bottleneck","description":"Significant portion of traces spent here"}],"environment":"PETCLINIC_CI#ID#1","severity":0.8711572605711211,"impact":0.3333333333333333,"criticality":0.48217189074494626,"reopenCount":0,"ticketLink":null,"isDismissible":true,"isReadable":true,"isDismissed":false,"prefixedCodeObjectId":"method:org.springframework.samples.petclinic.domain.OwnerValidation$_$ValidateUserAccess","customStartTime":null,"actualStartTime":"2024-04-06T00:00:00Z","firstCommitId":null,"lastCommitId":null,"deactivatedCommitId":null,"sourceSpanCodeObjectInsight":"","firstDetected":"2024-04-15T06:18:11.299532Z","lastDetected":"2024-04-15T07:57:10.634975Z","status":"Active","flags":[],"isRead":false,"firstFixed":null,"lastReopen":null,"lastDeactivated":null},{"name":"Bottleneck","type":"SpanEndpointBottleneck","category":"Performance","specifity":3,"importance":2,"isRecalculateEnabled":true,"span":{"name":"petVaccineRequests publish","displayName":"petVaccineRequests publish","instrumentationLibrary":"io.opentelemetry.kafka-clients-0.11","spanCodeObjectId":"span:io.opentelemetry.kafka-clients-0.11$_$petVaccineRequests publish","methodCodeObjectId":null,"kind":null,"codeObjectId":null},"slowEndpoints":[{"endpointInfo":{"route":"epHTTP:HTTP POST /owners/{ownerId}/pets/new","instrumentationLibrary":"io.opentelemetry.tomcat-10.0","serviceName":"spring-petclinic","codeObjectId":"org.springframework.samples.petclinic.owner.PetController$_$processCreationForm","spanCodeObjectId":"span:io.opentelemetry.tomcat-10.0$_$HTTP POST /owners/{ownerId}/pets/new","spanName":"HTTP POST /owners/{ownerId}/pets/new"},"probabilityOfBeingBottleneck":1.0,"avgDurationWhenBeingBottleneck":{"value":60.01,"unit":"sec","raw":60005566000.0},"avgFractionWhenBeingBottleneck":98.0,"impact":0.16666666666666666,"severity":0.9173609721789627,"criticality":0.2820841275338243,"requestPercentage":100,"traceId":"BFED90F122E2B30AEBB14F6A05FE156E"}],"p50":{"fraction":0.0,"maxDuration":{"value":0.0,"unit":"ns","raw":0.0}},"p95":{"fraction":0.0,"maxDuration":{"value":0.0,"unit":"ns","raw":0.0}},"p99":{"fraction":0.0,"maxDuration":{"value":0.0,"unit":"ns","raw":0.0}},"scope":"Span","spanInfo":{"name":"petVaccineRequests publish","displayName":"petVaccineRequests publish","instrumentationLibrary":"io.opentelemetry.kafka-clients-0.11","spanCodeObjectId":"span:io.opentelemetry.kafka-clients-0.11$_$petVaccineRequests publish","methodCodeObjectId":null,"kind":null,"codeObjectId":null},"id":"c197e18a-faef-11ee-9383-0689d248b915","shortDisplayInfo":{"title":"","targetDisplayName":"","subtitle":"","description":""},"codeObjectId":"io.opentelemetry.kafka-clients-0.11$_$petVaccineRequests publish","decorators":[{"title":"Bottleneck","description":"Significant portion of traces spent here"}],"environment":"PETCLINIC_CI#ID#1","severity":0.9173609721789627,"impact":0.16666666666666666,"criticality":0.2820841275338243,"reopenCount":0,"ticketLink":null,"isDismissible":true,"isReadable":true,"isDismissed":false,"prefixedCodeObjectId":"span:io.opentelemetry.kafka-clients-0.11$_$petVaccineRequests publish","customStartTime":null,"actualStartTime":"2024-04-06T00:00:00Z","firstCommitId":null,"lastCommitId":null,"deactivatedCommitId":null,"sourceSpanCodeObjectInsight":"","firstDetected":"2024-04-15T06:16:54.637247Z","lastDetected":"2024-04-15T07:54:38.179609Z","status":"Active","flags":[],"isRead":false,"firstFixed":null,"lastReopen":null,"lastDeactivated":null},{"name":"Slow Endpoint","type":"SlowEndpoint","category":"Performance","specifity":5,"importance":2,"decorators":[{"title":"Slow Endpoint","description":"Endpoint slow performance"}],"endpointsMedian":{"value":2.36,"unit":"sec","raw":2360123600.0},"endpointsMedianOfMedians":{"value":2.36,"unit":"sec","raw":2360123600.0},"endpointsP75":{"value":63.24,"unit":"sec","raw":63240332400.0},"median":{"value":64.78,"unit":"sec","raw":64782779500.0},"endpointsMedianOfP75":{"value":0.0,"unit":"ns","raw":0.0},"min":{"value":0.0,"unit":"ns","raw":0.0},"max":{"value":0.0,"unit":"ns","raw":0.0},"mean":{"value":0.0,"unit":"ns","raw":0.0},"p75":{"value":0.0,"unit":"ns","raw":0.0},"p95":{"value":0.0,"unit":"ns","raw":0.0},"p99":{"value":0.0,"unit":"ns","raw":0.0},"scope":"EntrySpan","endpointSpan":"OwnerControllerTests.shouldSaveNewOwnerPet","spanCodeObjectId":"span:com.digma.junit$_$OwnerControllerTests.shouldSaveNewOwnerPet","route":"epSpan:OwnerControllerTests.shouldSaveNewOwnerPet","serviceName":"spring-petclinic","spanInfo":{"name":"OwnerControllerTests.shouldSaveNewOwnerPet","displayName":"OwnerControllerTests.shouldSaveNewOwnerPet","instrumentationLibrary":"com.digma.junit","spanCodeObjectId":"span:com.digma.junit$_$OwnerControllerTests.shouldSaveNewOwnerPet","methodCodeObjectId":"method:org.springframework.samples.petclinic.integration.OwnerControllerTests$_$shouldSaveNewOwnerPet","kind":"Internal","codeObjectId":"org.springframework.samples.petclinic.integration.OwnerControllerTests$_$shouldSaveNewOwnerPet"},"id":"41e4068a-faef-11ee-ad76-0689d248b915","shortDisplayInfo":{"title":"","targetDisplayName":"OwnerControllerTests.shouldSaveNewOwnerPet","subtitle":"","description":"Median duration 64.78 sec"},"codeObjectId":"org.springframework.samples.petclinic.integration.OwnerControllerTests$_$shouldSaveNewOwnerPet","environment":"PETCLINIC_CI#ID#1","severity":0.0,"impact":0.0,"criticality":0.0,"reopenCount":0,"ticketLink":null,"isRecalculateEnabled":false,"isDismissible":true,"isReadable":true,"isDismissed":false,"prefixedCodeObjectId":"method:org.springframework.samples.petclinic.integration.OwnerControllerTests$_$shouldSaveNewOwnerPet","customStartTime":null,"actualStartTime":"2024-04-01T07:54:30.756553Z","firstCommitId":null,"lastCommitId":null,"deactivatedCommitId":null,"sourceSpanCodeObjectInsight":"","firstDetected":"2024-04-15T06:13:20.400186Z","lastDetected":"2024-04-15T07:54:30.758321Z","status":"Active","flags":[],"isRead":false,"firstFixed":null,"lastReopen":null,"lastDeactivated":null}],"unreadCount":5} diff --git a/src/main/java/org/springframework/samples/petclinic/config/RedisConfig.java b/src/main/java/org/springframework/samples/petclinic/config/RedisConfig.java index 258ddbac6..902b4f14d 100644 --- a/src/main/java/org/springframework/samples/petclinic/config/RedisConfig.java +++ b/src/main/java/org/springframework/samples/petclinic/config/RedisConfig.java @@ -1,2 +1,56 @@ -package org.springframework.samples.petclinic.config;public class RedisConfig { -} +// package org.springframework.samples.petclinic.config; +// +// +// import org.springframework.beans.factory.annotation.Value; +// import org.springframework.context.annotation.Bean; +// import org.springframework.context.annotation.Configuration; +// import org.springframework.data.redis.cache.RedisCacheConfiguration; +// import org.springframework.data.redis.cache.RedisCacheManager; +// import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +// import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +// import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +// import org.springframework.data.redis.serializer.RedisSerializationContext; +// +// import java.time.Duration; +// +// @Configuration +// public class RedisConfig { +// @Value("${redis.host}") +// private String redisHost; +// +// @Value("${redis.port}") +// private int redisPort; +// +// @Bean +// public LettuceConnectionFactory redisConnectionFactory() { +// RedisStandaloneConfiguration configuration = new +// RedisStandaloneConfiguration(redisHost, redisPort); +// +// return new LettuceConnectionFactory(configuration); +// } +// +//// @Bean +//// public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { +//// return RedisCacheManager.create(connectionFactory); +//// } +// +// @Bean +// public RedisCacheManager cacheManager() { +// RedisCacheConfiguration cacheConfig = +// myDefaultCacheConfig(Duration.ofMinutes(10)).disableCachingNullValues(); +// +// return RedisCacheManager.builder(redisConnectionFactory()) +// .cacheDefaults(cacheConfig) +// .withCacheConfiguration("vaccines", myDefaultCacheConfig(Duration.ofMinutes(5))) +// .withCacheConfiguration("vaccine", myDefaultCacheConfig(Duration.ofMinutes(1))) +// .build(); +// } +// +// private RedisCacheConfiguration myDefaultCacheConfig(Duration duration) { +// return RedisCacheConfiguration +// .defaultCacheConfig() +// .entryTtl(duration) +// .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new +// GenericJackson2JsonRedisSerializer())); +// } +// }