Pontus Rydin
ed42c83b50
Refactored grpc instumenter ( #72 )
...
* Refactored grpc instrumenter
* Cleaned up formatting
* Simplified interceptors
* Fixed some more formatting
* Formatting
* Addressed maintainer comments
2020-01-18 12:09:50 -08:00
Pontus Rydin
736c70ffe0
Refactored spymemcached ( #67 )
...
* Refactored spymemcached
* Fixed formatting issues
* Fixed formatting in an accidentally changed file
Co-authored-by: Trask Stalnaker <trask.stalnaker@gmail.com>
2020-01-16 19:36:32 -08:00
Tyler Benson
1d474353a5
Merge pull request #64 from trask/dd-merge
...
Merge changes from dd-trace-java 0.41.0
2020-01-16 16:09:50 -08:00
Trask Stalnaker
f25af170bf
Merge remote-tracking branch 'upstream/master' into dd-merge
2020-01-16 08:52:32 -08:00
Trask Stalnaker
c47f92c6b0
Merge tag 'v0.41.0' into dd-merge
2020-01-15 21:50:25 -08:00
Pontus Rydin
686f72e02f
Fixed test issues ( #62 )
2020-01-15 20:17:30 -08:00
Trask Stalnaker
80d36902a0
Initial work towards using OpenTelemetry API directly from instrumentation ( #55 )
...
* Rename setTag to setAttribute
* Deprecate Agent API
* Update base decorators
* Update akka-http
* Update google-http-client
* Update apache-httpasyncclient
* Update aws-java-sdk-1.11.0
* Update apache-httpclient
* Add SpanScopePair
* Shade OpenTelemetry usage in instrumentation
* Temp: exclude base decorators from code coverage
* Update datastax-cassandra
* Update dropwizard
* Update elasticsearch
* Update couchbase-2.0 and rxjava friends
* Update couchbase-2.6
2020-01-15 17:53:41 -08:00
Trask Stalnaker
8b0a140ed7
Update muzzle maven URL to use https ( #61 )
...
Also add a test.
Co-authored-by: Tyler Benson <tylerbenson@gmail.com>
2020-01-15 14:43:34 -08:00
Trask Stalnaker
71d264fd00
Rename package to io.opentelemetry.auto ( #54 )
...
* Remove publishing info
* Remove Datadog-Meta-Lang handling
* Misc renames
* Rename DD_ constant field names
* Rename DDSpanTypes to SpanTypes
* Rename DDTags to MoreTags
* Rename DDSpecification to AgentSpecification
* Rename DDLocationStrategy to AgentLocationStrategy
* Rename DDCachingPoolStrategy to AgentCachingPoolStrategy
* Rename DDTransformers to AgentTransformers
* Script: rename datadog.trace to io.opentelemetry.auto
find -wholename */datadog/trace -exec mkdir -p {}/../../io/opentelemetry \; -exec mv {} {}/../../io/opentelemetry/auto \;
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i 's/datadog\.trace\./io.opentelemetry.auto./g'
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i 's/datadog\/trace\//io\/opentelemetry\/auto\//g'
find -type f -name "*.gradle" | xargs sed -i 's/datadog\.trace\./io.opentelemetry.auto./g'
find -type f -name "*.gradle" | xargs sed -i 's/datadog\/trace\//io\/opentelemetry\/auto\//g'
* Script: rename more packages
find -wholename */datadog/test -exec mkdir -p {}/../../io/opentelemetry \; -exec mv {} {}/../../io/opentelemetry \;
find -wholename */datadog/smoketest -exec mkdir -p {}/../../io/opentelemetry \; -exec mv {} {}/../../io/opentelemetry \;
find -wholename */datadog/perftest -exec mkdir -p {}/../../io/opentelemetry \; -exec mv {} {}/../../io/opentelemetry \;
find -wholename */datadog/benchmark -exec mkdir -p {}/../../io/opentelemetry \; -exec mv {} {}/../../io/opentelemetry \;
find -wholename */datadog/loadgenerator -exec mkdir -p {}/../../io/opentelemetry \; -exec mv {} {}/../../io/opentelemetry \;
# keep these outside of io.opentelemetry.auto for now at least (things under io.opentelemetry.auto are not instrumented)
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt -o -name *.sh | xargs sed -i 's/datadog\.test\b/io.opentelemetry.test/g'
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt -o -name *.sh | xargs sed -i 's/datadog\.smoketest\b/io.opentelemetry.smoketest/g'
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt -o -name *.sh | xargs sed -i 's/datadog\.perftest\b/io.opentelemetry.perftest/g'
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt -o -name *.sh | xargs sed -i 's/datadog\.benchmark\b/io.opentelemetry.benchmark/g'
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt -o -name *.sh | xargs sed -i 's/datadog\.loadgenerator\b/io.opentelemetry.loadgenerator/g'
# ok to move this into io.opentelemetry.auto
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt -o -name *.sh | xargs sed -i 's/datadog\.slf4j\b/io.opentelemetry.auto.slf4j/g'
find -type f -name "*.gradle" | xargs sed -i 's/datadog\.test\b/io.opentelemetry.test/g'
find -type f -name "*.gradle" | xargs sed -i 's/datadog\.smoketest\b/io.opentelemetry.smoketest/g'
find -type f -name "*.gradle" | xargs sed -i 's/datadog\.perftest\b/io.opentelemetry.perftest/g'
find -type f -name "*.gradle" | xargs sed -i 's/datadog\.benchmark\b/io.opentelemetry.benchmark/g'
find -type f -name "*.gradle" | xargs sed -i 's/datadog\.loadgenerator\b/io.opentelemetry.loadgenerator/g'
find -type f -name "*.gradle" | xargs sed -i 's/datadog\.slf4j\b/io.opentelemetry.auto.slf4j/g'
* Intellij: format and organize imports
* Script: More renaming
find -name *.xml | xargs sed -i 's/<logger name="datadog"/<logger name="io.opentelemetry.auto"/g'
find -name *.java | xargs sed -i 's/LoggerFactory.getLogger("datadog")/LoggerFactory.getLogger("io.opentelemetry.auto")/g'
find -name *.java | xargs sed -i 's/"datadog.span"/"opentelemetry.auto.span"/g'
find -name *.java -o -name *.groovy | xargs sed -i 's/"datadog.doesnotexist"/"io.opentelemetry.auto.doesnotexist"/g'
# keep this outside of io.opentelemetry.auto for now at least (things under io.opentelemetry.auto are not instrumented)
find -name *.yaml | xargs sed -i 's/"datadog.benchmark"/"io.opentelemetry.benchmark"/g'
find -type f -name "*.gradle" | xargs sed -i 's/datadog\.forked/io.opentelemetry.auto.forked/g'
find -name *.yml | xargs sed -i 's/datadog\.forked/io.opentelemetry.auto.forked/g'
* Improve comment
* Script: rename dd- modules
git mv dd-java-agent java-agent
git mv java-agent/dd-java-agent.gradle java-agent/java-agent.gradle
git mv dd-trace-api trace-api
git mv trace-api/dd-trace-api.gradle trace-api/trace-api.gradle
git mv dd-smoke-tests smoke-tests
git mv smoke-tests/dd-smoke-tests.gradle smoke-tests/smoke-tests.gradle
git mv dd-trace-java.gradle trace-java.gradle
find -type f -name "*.gradle" | xargs sed -i 's/\bdd-java-agent\b/java-agent/g'
find -type f -name "*.gradle" | xargs sed -i 's/\bdd-trace-api\b/trace-api/g'
find -type f -name "*.gradle" | xargs sed -i 's/\bdd-smoke-tests\b/smoke-tests/g'
find -type f -name "*.gradle" | xargs sed -i 's/\bdd-trace-java\b/trace-java/g'
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt -o -name *.sh -o -name *.yml | xargs sed -i 's/\bdd-java-agent\b/java-agent/g'
sed -i 's/\bdd-java-agent\b/java-agent/g' .gitignore
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt -o -name *.sh -o -name *.yml | xargs sed -i 's/\bdd-trace-api\b/trace-api/g'
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt -o -name *.sh -o -name *.yml | xargs sed -i 's/\bdd-smoke-tests\b/smoke-tests/g'
* Remove unused config - service.name
* Remove unused config - writer.type
* Remove unused config - trace.partial.flush.min
* Script: rename dd. test packages
find -wholename */dd/trace/instrumentation -exec mkdir -p {}/../../io/opentelemetry/test \; -exec mv {} {}/../../io/opentelemetry/test \;
find -wholename */dd/test/trace/annotation -exec mkdir -p {}/../../io/opentelemetry/test \; -exec mv {} {}/../../io/opentelemetry/test \;
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i 's/dd\.trace\.instrumentation\b/io.opentelemetry.test.instrumentation/g'
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i 's/dd\.test.trace\.annotation\b/io.opentelemetry.test.annotation/g'
* Script: rename dd properties
DD_PROP=opentelemetry.auto
DD_ENV=OPENTELEMETRY_AUTO
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\"dd\.\"/\"$DD_PROP.\"/g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\"DD_\"/\"${DD_ENV}_\"/g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.integration\./$DD_PROP.integration./g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.integrations\./$DD_PROP.integrations./g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bDD_INTEGRATION_/${DD_ENV}_INTEGRATION_/g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bDD_INTEGRATIONS_/${DD_ENV}_INTEGRATIONS_/g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.trace\./$DD_PROP.trace./g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bDdd\.trace\./D$DD_PROP.trace./g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bDD_TRACE_/${DD_ENV}_TRACE_/g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.logs\./$DD_PROP.logs./g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.trace_id\b/$DD_PROP.trace_id/g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.span_id\b/$DD_PROP.span_id/g"
find -type f -name "*.gradle" | xargs sed -i "s/\bdd\.trace\./$DD_PROP.trace./g"
find -type f -name "*.properties" | xargs sed -i "s/\bdd\.trace\./$DD_PROP.trace./g"
# test code
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.prop\./$DD_PROP.prop./g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.float\./$DD_PROP.float./g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.garbage\./$DD_PROP.garbage./g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bdd\.negative\./$DD_PROP.negative./g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bDD_ENV_/${DD_ENV}_ENV_/g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bDD_FLOAT_/${DD_ENV}_FLOAT_/g"
# test code
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\"is-dd-server\"/\"is-test-server\"/g"
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i "s/\bisDDServer\b/isTestServer/g"
* Rename dd-java-tracer.properties to java-tracer.properties
* Rename DDTracingUtil to OpenTelemetryTracingUtil
* Codec.java was removed already
* Rename __datadog to __opentelemetry
* Misc renames
* Script: remove redundant sub-package
find -wholename */io/opentelemetry/auto/agent -exec bash -c "mv {}/* {}/.." \;
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i 's/io\.opentelemetry\.auto\.agent\b/io.opentelemetry.auto/g'
find -type f -name "*.gradle" | xargs sed -i 's/io\.opentelemetry\.auto\.agent\b/io.opentelemetry.auto/g'
find -name *.java -o -name *.groovy -o -name *.scala -o -name *.kt | xargs sed -i 's/io\/opentelemetry\/auto\/agent\b/io\/opentelemetry\/auto/g'
* Shorten logging config keys
2020-01-14 13:57:01 -08:00
Trask Stalnaker
a3f110a909
Improve sporadic test failures ( #52 )
...
* Remove unnecessary span sorting
* Remove blockUntilChildSpansFinished
* Sort traces after waiting for expected number
* Fix sporadic test failure
* Fix sporadic test failure
* Sort spans after waiting for expected number
* Remove unnecessary waitForTraces
* Remove unnecessary trace sorting
* Encapsulate ListWriter data to fix race conditions
* Improve consistency of span ordering in tests
* Update tests to conform with new span ordering
* Update tests to conform with ListWriter changes
2020-01-14 11:36:06 -08:00
Trask Stalnaker
de0f3fc3c1
Fix muzzle build ( #53 )
...
* Adjust version compatibility to only 2.x
They recently released 3.0.0 which is not compatible with our instrumentation.
* Also update latestDepTest ranges.
Co-authored-by: Tyler Benson <tylerbenson@gmail.com>
2020-01-14 10:56:00 -08:00
Tyler Benson
7fabcaaecb
Version 0.41.0
2020-01-14 10:48:14 -08:00
Trask Stalnaker
64fd99862a
Use OpenTelemetry API ( #51 )
...
* Remove dd-trace-ot
* Remove disableShadowRelocate
* Remove GlobalTracer and ScopeListener
* Comment out instr depending on activeScope
* OpenTelemetry implementation
* Update instrumentation tests to pass
* Update test infrastruture
* Update spring-webflux instrumentation
* Update jax-rs-annotation instrumentation
* Fix ratpack failing test
2020-01-13 16:51:36 -08:00
Tyler Benson
a52a1420db
Merge pull request #1165 from DataDog/tyler/servlet
...
Add servlet integrations for request and response dispatch back in.
2020-01-13 13:17:29 -08:00
Tyler Benson
d42e72b683
Merge pull request #1171 from DataDog/tyler/bb-filter
...
Remove more declared method filtering for optimization
2020-01-13 13:05:28 -08:00
Tyler Benson
ef6cd9c52c
Merge pull request #1170 from DataDog/tyler/couchbase
...
Adjust version compatibility to only 2.x
2020-01-13 13:04:57 -08:00
Tyler Benson
5fe26f004b
Remove more declared method filtering for optimization
...
Same logic that was applied in #1169
2020-01-13 12:52:41 -08:00
Nikolay Martynov
6bf1e159b0
Merge pull request #1167 from DataDog/mar-kolya/upgrade-jmxfetch
...
Upgrade jmxfetch to latest version
2020-01-13 15:45:12 -05:00
Tyler Benson
77cdd210c6
Also update latestDepTest ranges.
2020-01-13 12:31:38 -08:00
Nikolay Martynov
cb7faee63f
Remove logging config from jmxfetch setup
...
It already uses slf4j
2020-01-13 15:23:04 -05:00
Tyler Benson
603155f56f
Merge pull request #1169 from DataDog/tyler/remove-filter
...
Optimize HasSuperMethodMatcher logic
2020-01-13 12:11:27 -08:00
Tyler Benson
a0f0d45c74
Adjust version compatibility to only 2.x
...
They recently released 3.0.0 which is not compatible with our instrumentation.
2020-01-13 12:10:57 -08:00
Nikolay Martynov
dcc5726797
Fix jmxfetch log level and log location config
...
Looks like this got lost in b505c60543
2020-01-13 15:05:45 -05:00
Nikolay Martynov
d96d8e3c71
Upgrade gradle
2020-01-13 14:46:06 -05:00
Nikolay Martynov
d55d13e239
Exclude some dependencies from jmxfetch
2020-01-13 14:45:19 -05:00
Tyler Benson
3eecb03fe2
Merge pull request #1168 from DataDog/tyler/fix-grpc-trace-header
...
Fixing GRPC `-bin` header unmarshalling
2020-01-13 11:37:54 -08:00
Nikolay Martynov
8b5d89501b
Upgrade jmxfetch to latest version
2020-01-13 14:19:03 -05:00
Tyler Benson
25397fd128
Fix formatting and add test.
2020-01-13 11:18:45 -08:00
Bruce Yu
13b84416b9
Blacklisting headers with -bin suffixes in GrpcExtractAdapter
2020-01-13 11:18:45 -08:00
Tyler Benson
49425e9963
Move request-response linking to main servlet advice
...
servlet-service is off by default, so we can't rely on it being called there.
2020-01-13 10:48:35 -08:00
Tyler Benson
e440eba9a1
Enable Servlet request and response dispatcher instrumentation by default.
...
Change config for Servlet Filter and Service and JDBC DataSource instrumentation so it must be explicitly enabled (won't be enabled by accident if all of servlet is enabled).
2020-01-10 13:51:21 -08:00
Tyler Benson
43fbf28035
Revert "Remove experimental jdbc and servlet integrations until further evaluation"
...
This reverts commit 2432a92230
.
2020-01-10 12:53:24 -08:00
Tyler Benson
6b9c92eefa
Merge pull request #1164 from DataDog/tyler/jdbc-error-handling
...
Better error handling for getClientInfo in JDBCDecorator
2020-01-09 09:20:46 -08:00
Tyler Benson
7cb24f35c0
Better error handling for getClientInfo in JDBCDecorator
...
An exception there caused a span to be created but then never finished.
2020-01-08 15:10:54 -08:00
Trask Stalnaker
426b01c7e7
Remove continuation support ( #49 )
...
* Remove continuation
* Remove continuation cancel
* Move TraceScope to Agent API
* Remove unnecessary method
* Remove TraceScope
* Remove activeScope
* Fix continuation comments
* Remove AgentScope.Continuation
* Partial revert of "Remove activeScope"
2020-01-07 18:45:08 -08:00
Tyler Benson
5e8af8439a
Optimize HasSuperMethodMatcher logic
...
Instead of filtering then iterating, just iterate through everything and apply filter inline.
This will help avoid allocation for filter iterator and improve if early match is found.
2020-01-07 17:10:01 -08:00
Trask Stalnaker
555c232ea4
Missed merge from dd-trace-java ( #47 )
2020-01-06 17:10:31 -08:00
Tyler Benson
8500dbc2ba
Merge pull request #1156 from DataDog/tyler/ddagentwriter-split
...
Split DDAgentWriter into smaller classes
2020-01-03 11:19:28 -08:00
Tyler Benson
c370705259
Merge pull request #46 from open-telemetry/otel-dd-merged
...
Merge changes from dd-trace-java 0.40.0
2020-01-03 10:54:51 -08:00
Tyler Benson
03dd908fdb
Merge pull request #1158 from DataDog/tyler/aws-1-tagging
...
Add various tags for AWS SDK v1.x
2020-01-03 08:38:56 -08:00
Tyler Benson
4947dc3bd3
Add various tags for AWS SDK v1.x
...
This brings it inline with the v2 instrumentation.
2020-01-02 13:23:30 -08:00
Tyler Benson
dacafe4217
Merge pull request #1157 from DataDog/pawel/rmi-add-client-and-server-info-to-decorators
...
[rmi] add instrumentation names to client and server decorators, remove default client service name
2020-01-02 11:41:40 -08:00
Tyler Benson
e84e6eb25d
Merge changes from dd-trace-java 0.40.0
...
https://github.com/DataDog/dd-trace-java/releases/tag/v0.40.0
# Conflicts:
# dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java
# dd-java-agent/instrumentation/akka-http-10.0/src/test/groovy/AkkaHttpServerInstrumentationTest.groovy
# dd-java-agent/instrumentation/dropwizard/src/test/groovy/DropwizardTest.groovy
# dd-java-agent/instrumentation/glassfish/src/test/groovy/GlassFishServerTest.groovy
# dd-java-agent/instrumentation/google-http-client/src/test/groovy/AbstractGoogleHttpClientTest.groovy
# dd-java-agent/instrumentation/jetty-8/src/test/groovy/JettyHandlerTest.groovy
# dd-java-agent/instrumentation/play-2.4/src/test/groovy/server/PlayServerTest.groovy
# dd-java-agent/instrumentation/play-2.6/src/test/groovy/server/PlayServerTest.groovy
# dd-java-agent/instrumentation/ratpack-1.4/src/test/groovy/server/RatpackHttpServerTest.groovy
# dd-java-agent/instrumentation/servlet/request-2/src/test/groovy/JettyServlet2Test.groovy
# dd-java-agent/instrumentation/servlet/request-3/src/test/groovy/AbstractServlet3Test.groovy
# dd-java-agent/instrumentation/servlet/request-3/src/test/groovy/JettyServlet3Test.groovy
# dd-java-agent/instrumentation/servlet/request-3/src/test/groovy/TomcatServlet3Test.groovy
# dd-java-agent/instrumentation/spring-webmvc-3.1/src/test/groovy/test/SpringBootBasedTest.groovy
# dd-java-agent/src/test/groovy/datadog/trace/agent/JMXFetchTest.groovy
# dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy
# dd-trace-api/src/main/java/datadog/trace/api/Config.java
# dd-trace-ot/src/main/java/datadog/opentracing/DDSpan.java
# dd-trace-ot/src/main/java/datadog/opentracing/decorators/DDDecoratorsFactory.java
# dd-trace-ot/src/main/java/datadog/trace/common/writer/DDAgentWriter.java
# dd-trace-ot/src/test/groovy/datadog/opentracing/decorators/SpanDecoratorTest.groovy
# dd-trace-ot/src/test/groovy/datadog/trace/api/writer/DDAgentWriterTest.groovy
2020-01-02 08:28:06 -08:00
Laplie Anderson
6b6554996a
Merge pull request #1155 from DataDog/landerson/muzzle-scan-classloader-matcher
...
Add classloader matcher to muzzle scan
2019-12-30 10:12:59 -05:00
Pawel Chojnacki
bbaf7278a6
[rmi] remove rmi client service name
2019-12-24 11:59:29 +01:00
Pawel Chojnacki
a4b0dcbc9f
[rmi] add instrumentation names to client and server decorators
2019-12-23 19:05:34 +01:00
Tyler Benson
ab33ed4a02
Begin 0.41.0
2019-12-23 10:04:47 -08:00
Tyler Benson
b8210ceea5
Version 0.40.0
2019-12-23 09:33:30 -08:00
Pawel Chojnacki
65c701dd51
Merge pull request #1128 from DataDog/pawel/add_rmi_support
...
Add RMI support
2019-12-23 14:38:46 +01:00
Pawel Chojnacki
f71ba14016
[rmi] use simple thread local for propagating context
...
+ add more documentation
2019-12-23 13:25:14 +01:00