Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
5553d45
grafana dashboards
m4gshm Nov 2, 2025
49adbd4
grafana: tracing, dashboards
m4gshm Nov 2, 2025
af501a8
grafana dashboards, integration test fix
m4gshm Nov 23, 2025
d1f7451
integration test for docker packed java services
m4gshm Dec 1, 2025
0c28944
integration test for docker packed java services
m4gshm Dec 4, 2025
0c93498
integration test for native go services
m4gshm Dec 6, 2025
a8a1baf
stress test for dockerized go services
m4gshm Dec 6, 2025
177bdf8
java tracing
m4gshm Dec 10, 2025
d582164
java tracing
m4gshm Dec 10, 2025
ed74a4e
java tracing
m4gshm Dec 12, 2025
b4da630
java tracing
m4gshm Dec 12, 2025
69a4434
java,go tracing
m4gshm Dec 13, 2025
461b0dd
go grpc gateway tracing
m4gshm Dec 13, 2025
d22d87c
java,go queries sync
m4gshm Dec 14, 2025
a2befad
java reduce blockable threads
m4gshm Dec 19, 2025
45a6efe
java reduce blockable threads
m4gshm Dec 19, 2025
1b64d01
spring boot 4
m4gshm Dec 19, 2025
8dd6861
spring boot sync service versions (blocked grpc, web mvc, jdbc)
m4gshm Jan 6, 2026
4b4beed
spring boot sync service versions (blocked grpc, web mvc, jdbc)
m4gshm Jan 6, 2026
f60e884
integration test fixes
m4gshm Jan 6, 2026
4da373d
integration test fixes
m4gshm Jan 7, 2026
e827d7c
integration test fixes
m4gshm Jan 8, 2026
49cefb3
tracing
m4gshm Jan 9, 2026
1747af3
jooq query improve
m4gshm Jan 9, 2026
448b3b9
jooq query improve
m4gshm Jan 13, 2026
3b16eae
virt thread using
m4gshm Jan 19, 2026
9506021
taskfiles
m4gshm Jan 20, 2026
339b33b
list orders testing
m4gshm Jan 22, 2026
46dfa49
k6 tests
m4gshm Jan 22, 2026
d01ea87
list orders testing
m4gshm Jan 27, 2026
305f07d
list orders testing
m4gshm Jan 27, 2026
f533333
flamegraph tools
m4gshm Jan 30, 2026
5528203
list orders testing
m4gshm Jan 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@
.settings
docker/tempo-data
*.exe
rust/target
rust/target
golang/docker/cmd/
!golang/docker/cmd/.gitkeep
7 changes: 1 addition & 6 deletions .run/OrdersApplication.run.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,7 @@
<configuration default="false" name="OrdersApplication" type="Application" factoryName="Application" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="io.github.m4gshm.orders.OrdersApplication" />
<module name="java.orders.orders-grpc-service.main" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="io.github.m4gshm.orders.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="VM_PARAMETERS" value="-Xmx1g" />
<method v="2">
<option name="Make" enabled="true" />
</method>
Expand Down
50 changes: 0 additions & 50 deletions .run/OrdersGrpcTest.run.xml

This file was deleted.

2 changes: 2 additions & 0 deletions .run/ReserveApplication.run.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<configuration default="false" name="ReserveApplication" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="io.github.m4gshm.reserve.ReserveApplication" />
<module name="java.reserve.reserve-grpc-service.main" />
<shortenClasspath name="ARGS_FILE" />
<option name="VM_PARAMETERS" value="-Xmx1g" />
<method v="2">
<option name="Make" enabled="true" />
</method>
Expand Down
8 changes: 4 additions & 4 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@
"version": "0.2.0",
"configurations": [
{
"name": "Launch payment",
"name": "Launch payments",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/golang/cmd/payment"
"program": "${workspaceFolder}/golang/cmd/payments"
},
{
"name": "Launch order",
"name": "Launch orders",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/golang/cmd/order"
"program": "${workspaceFolder}/golang/cmd/orders"
},
{
"name": "Launch reserve",
Expand Down
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"java.compile.nullAnalysis.mode": "automatic",
"java.configuration.updateBuildConfiguration": "interactive"
"java.configuration.updateBuildConfiguration": "automatic",
"java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx4G -Xms100m -Xlog:disable"
}
24 changes: 15 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@
7. use examples from the [request](request) directory to create an order

## Run Go
1. Just reuse DB populated by gralde build
2. `cd ./golang`
3. `task`
4. `task run`
5. open in browser http://localhost:8001/swagger-ui/index.html

1. Just reuse DB populated by gralde build
2. `cd ./golang`
3. `task`
4. `task run`
5. open in browser http://localhost:8001/swagger-ui/index.html

## Comparsion

Expand All @@ -32,14 +33,19 @@
| RDBC access layer generator | Jooq | Sqlc |
| DB migration lib | Liquibase | Goose |
| Tests engine | junit5 | _built-in_ |
| Integration tests | jvm-test-suite gradle plugin |   |
| Integration tests | jvm-test-suite gradle plugin | \- |
| Mock lib | Mockito | Mockio |
| REST engine | Spring Webflux | _built-in http.Server_ |
| GRPC engine lib | io.grpc:grpc-netty-shaded | google.golang.org/grpc |
| GRPC code generator | com.google.protobuf gradle plugin | easyp |
| GRPC-REST transcoding | io.github.danielliu1123:grpc-server-boot-starter | grpc-gateway protoc plugin |
| GRPC-REST Open API generator | io.github.danielliu1123:grpc-starter-transcoding-springdoc | openapiv2 protoc plugin |
| Docker container builder |   |   |
| Docker container builder | Gradle plugin com.bmuschko.docker-java-application | native |
| Kafka lib | Spring Kafka, reactor-kafka | franz-go |
| Tracing | opentelemetry-spring-boot-starter |   |
| Metrics for prometheus | actuator |   |
| Tracing (Otel) | opentelemetry-spring-boot-starter | ? |
| Otel exporter | ? | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrp |
| DB connection tracing | ? | ? |
| GRPC connection tracing | ? | ? |
| Prometheus http api provider | actuator | github.com/prometheus/client\_golang/prometheus/promhttp |
| Prometheus DB connection collector | actuator | github.com/cmackenzie1/pgxpool-prometheus |
| Config properties | Spring Boot (property files, env vars) | env vars |
75 changes: 75 additions & 0 deletions docker/Taskfile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
version: "3"

tasks:
default:
cmds:
- task: run-docker-requirements

run-commons-min:
desc: "Run docker required services (postgres, kafka)"
cmds:
- docker-compose -f docker-compose-commons-min.yaml up -d
stop-commons-min:
cmds:
- docker-compose -f docker-compose-commons-min.yaml down

run-commons:
desc: "Run docker required services (postgres, kafka, tracing, monitoring, etc.)"
cmds:
- docker-compose -f docker-compose-commons.yaml up -d
stop-commons:
cmds:
- docker-compose -f docker-compose-commons.yaml down

stop-java:
desc: "Stop docker java services"
cmds:
- docker-compose -f docker-compose-commons.yaml -f docker-compose-java.yaml down jvm-orders-grpc-service jvm-payments-grpc-service jvm-reserve-grpc-service
run-java:
desc: "Run docker java reactive services"
cmds:
- docker-compose -f docker-compose-commons.yaml -f docker-compose-java.yaml up -d

stop-java-sync:
desc: "Stop docker java services"
cmds:
- docker-compose -f docker-compose-commons.yaml -f docker-compose-java-sync.yaml down jvm-orders-grpc-service-sync jvm-payments-grpc-service-sync jvm-reserve-grpc-service-sync
run-java-sync:
desc: "Run docker java sync services"
cmds:
- docker-compose -f docker-compose-commons.yaml -f docker-compose-java-sync.yaml up -d

stop-java-sync-min:
desc: "Stop docker java services"
cmds:
- docker-compose -f docker-compose-commons-min.yaml -f docker-compose-java-sync.yaml down jvm-orders-grpc-service-sync jvm-payments-grpc-service-sync jvm-reserve-grpc-service-sync
run-java-sync-min:
desc: "Run docker java sync services"
cmds:
- docker-compose -f docker-compose-commons-min.yaml -f docker-compose-java-sync.yaml up -d

stop-go-min:
desc: "Stop docker go services"
cmds:
- docker-compose -f docker-compose-commons-min.yaml -f docker-compose-go.yaml down go-orders-grpc-service go-payments-grpc-service go-reserve-grpc-service
run-go-min:
desc: "Run docker go services"
cmds:
- docker-compose -f docker-compose-commons-min.yaml -f docker-compose-go.yaml up -d

stop-go:
desc: "Stop docker go services"
cmds:
- docker-compose -f docker-compose-commons.yaml -f docker-compose-go.yaml down go-orders-grpc-service go-payments-grpc-service go-reserve-grpc-service
run-go:
desc: "Run docker go services"
cmds:
- docker-compose -f docker-compose-commons.yaml -f docker-compose-go.yaml up -d

recreate-requirements:
desc: "Clean docker required services and restart"
cmds:
- |
docker-compose down
docker volume rm distributed-transactions-practice_db-data
- task: run-docker-requirements
63 changes: 63 additions & 0 deletions docker/alloy/config.alloy
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* Alloy Configuration for OpenTelemetry Trace Collection with Service Graph Generation
*/

// Receive OpenTelemetry traces
otelcol.receiver.otlp "default" {
http {}
grpc {}

output {
traces = [otelcol.processor.batch.default.input]
}
}

// Batch processor to improve performance
otelcol.processor.batch "default" {
output {
traces = [
otelcol.connector.servicegraph.default.input,
otelcol.exporter.otlp.tempo.input,
]
}
}

// Service Graph Generator
otelcol.connector.servicegraph "default" {
metrics_flush_interval = "11s"
dimensions = ["service.name", "http.method"]

// Configure the span store for better pairing
store {
max_items = 5000
ttl = "30s"
}

output {
metrics = [otelcol.exporter.otlphttp.prometheus.input]
}
}

// Send service graph metrics to Prometheus via OTLP
otelcol.exporter.otlphttp "prometheus" {
client {
endpoint = "http://prometheus:9090/api/v1/otlp"
tls {
insecure = true
}
}
}

// Send traces to Tempo for storage and visualization
otelcol.exporter.otlp "tempo" {
client {
endpoint = "tempo:4317"
tls {
insecure = true
}
}
}

livedebugging {
enabled = true
}
57 changes: 57 additions & 0 deletions docker/docker-compose-commons-min.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: distributed-transactions-practice
volumes:
db-data:
driver: local

services:
postgres:
deploy:
resources:
limits:
cpus: '2'
memory: 512M
reservations:
cpus: '0.25'
memory: 64M
image: postgres:17.0
ports:
- "5000:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- db-data:/var/lib/postgresql/data
- ./postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
command: postgres -c max_prepared_transactions=100 -c max_connections=3000
kafka-1:
deploy:
resources:
limits:
cpus: '0.5'
memory: 1G
reservations:
cpus: '0.25'
memory: 64M
image: apache/kafka:3.9.1
hostname: kafka-1
ports:
- "9092:9092"
environment:
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT_HOST://localhost:9092,PLAINTEXT://kafka-1:19092'
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka-1:29093'
KAFKA_LISTENERS: 'CONTROLLER://:29093,PLAINTEXT_HOST://:9092,PLAINTEXT://:19092'
KAFKA_JMX_PORT: 9992
KAFKA_JMX_HOSTNAME: kafka-1
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
CLUSTER_ID: '4L6g3nShT-eMCtK--X86sw'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 1
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 1
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
Loading