Skip to content

chore: add a way for running local observability stack with Tolgee running outside of docker#3448

Merged
Anty0 merged 3 commits intomainfrom
jirikuchynka/local-observability-dev
Feb 15, 2026
Merged

chore: add a way for running local observability stack with Tolgee running outside of docker#3448
Anty0 merged 3 commits intomainfrom
jirikuchynka/local-observability-dev

Conversation

@Anty0
Copy link
Collaborator

@Anty0 Anty0 commented Feb 3, 2026

Summary by CodeRabbit

  • New Features

    • Opt-in run task to launch the app with a local observability/tracing stack.
    • Helper to prepare the OpenTelemetry agent for local/IDE use.
    • Dedicated local observability Docker Compose for development (tracing, metrics, logging, DB, Redis).
  • Documentation

    • Updated setup docs with two clear options: full Docker stack or local app with Docker-based observability.
    • Clarified commands, verification steps, and troubleshooting for traces and dashboards.

@Anty0 Anty0 requested a review from gabrielshanahan February 3, 2026 16:43
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 3, 2026

📝 Walkthrough

Walkthrough

Adds an opt-in local OpenTelemetry observability setup: new Gradle tasks to run the backend with the OTEL Java agent, a Docker Compose file defining the observability stack (tempo, otel-collector, loki, promtail, prometheus, grafana, postgres, redis), and updated docs describing two setup options and verification steps.

Changes

Cohort / File(s) Summary
Gradle Build Configuration
backend/app/build.gradle
Adds copyOtelAgent (Copy task) to place the OTEL Java agent into buildDir/otel and bootRunWithObservability (BootRun) that applies -javaagent at execution time, sets spring.profiles.active=dev, and injects OTEL/DB/Redis env vars for local Docker-based services.
Observability Infrastructure
docker/docker-compose.local-observability-stack-dev.yaml
New Docker Compose file defining a local observability stack: Tempo, OTEL Collector, Loki, Promtail, Prometheus, Grafana, PostgreSQL, and Redis with images, commands, volumes, ports, and inter-service dependencies (healthcheck notes included).
Documentation
docs/local-observability-stack/1_Setting_Up_the_Tracing_Stack.md, docs/observability/README.md
Restructures setup into two options (Full Docker Stack vs Local Tolgee + Docker Observability), updates commands to reference the new Gradle task and compose filename, and revises verification/troubleshooting instructions.

Sequence Diagram(s)

sequenceDiagram
    participant Dev as Developer (local)
    participant Gradle as Gradle Task
    participant App as Backend App
    participant OTEL as OTEL Collector
    participant Tempo as Tempo
    participant Grafana as Grafana

    Dev->>Gradle: ./gradlew server-app:bootRunWithObservability
    Gradle->>Gradle: ensure `copyOtelAgent` executed
    Gradle->>App: set JVM arg -javaagent=buildDir/otel/opentelemetry-javaagent.jar and env vars
    Dev->>OTEL: docker compose -f docker/docker-compose.local-observability-stack-dev.yaml up
    App->>OTEL: send traces/metrics/logs
    OTEL->>Tempo: forward traces
    OTEL->>Grafana: forward metrics/logs (via Prometheus/Loki)
    Grafana->>Dev: visualize traces/metrics/logs
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • JanCizmar

Poem

🐰 I nudged an OTEL jar into place with a hop,
Tempo and Loki hum while traces plop,
BootRun wakes up with observability bright,
Grafana paints the metrics into light,
Hooray for hops, traces, and dashboard delight! 🎉

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Merge Conflict Detection ⚠️ Warning ❌ Merge conflicts detected (336 files):

⚔️ .gitignore (content)
⚔️ CHANGELOG.md (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/AllKeysController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/KeyScreenshotController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/ProjectActivityController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/ProjectStatsController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/TagsController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/batch/V2ExportController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/dataImport/V2ImportController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/keys/KeyController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/translation/CreateOrUpdateTranslationsFacade.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/api/v2/controllers/translation/TranslationsController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/component/KeyComplexEditHelper.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/controllers/ExportController.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/facade/ProjectWithStatsFacade.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/contentDelivery/ContentDeliveryConfigModel.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/key/KeyModel.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/key/KeyModelAssembler.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/key/KeyWithDataModel.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/key/KeyWithDataModelAssembler.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/key/KeyWithScreenshotsModelAssembler.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/project/ProjectModel.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/project/ProjectModelAssembler.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/task/TaskModel.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/task/TaskWithProjectModel.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/translations/KeyWithTranslationsModel.kt (content)
⚔️ backend/api/src/main/kotlin/io/tolgee/hateoas/translations/KeyWithTranslationsModelAssembler.kt (content)
⚔️ backend/app/build.gradle (content)
⚔️ backend/app/src/main/kotlin/io/tolgee/configuration/AsyncMethodConfiguration.kt (content)
⚔️ backend/app/src/main/kotlin/io/tolgee/configuration/AsyncWebMvcConfiguration.kt (content)
⚔️ backend/app/src/main/kotlin/io/tolgee/postgresRunners/PostgresDockerRunner.kt (content)
⚔️ backend/app/src/main/kotlin/io/tolgee/postgresRunners/PostgresEmbeddedRunner.kt (content)
⚔️ backend/app/src/main/resources/application-cli.yaml (content)
⚔️ backend/app/src/main/resources/application-e2e.yaml (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/AllKeysControllerTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/organizationController/OrganizationProjectsControllerTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/tags/TagsControllerComplexOperationTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/translations/v2TranslationsController/TranslationsControllerModificationTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/translations/v2TranslationsController/TranslationsControllerViewTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2ImageUploadController/AbstractV2ImageUploadControllerTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2ImportController/SingleStepImportControllerResolvableTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2ImportController/SingleStepImportControllerTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2KeyController/KeyControllerComplexEditTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2KeyController/KeyControllerCreationTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2KeyController/KeyControllerInfoTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2KeyController/KeyControllerKeySearchTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2KeyController/KeyControllerPluralizationTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2KeyController/KeyControllerResolvableImportTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2KeyController/KeyControllerTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2ProjectsController/ProjectsControllerCreateTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2ScreenshotController/AbstractV2ScreenshotControllerTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/AbstractBatchJobConcurrentTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobConcurrencyTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobFailureAndCancellationTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobNoOpPerformanceWithRedisTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobParallelExecutionTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobProgressTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobProjectLockingTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobRecoveryTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobRoundRobinTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobStartupDelayTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobStressTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/batch/BatchJobsGeneralWithRedisTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/cache/CacheWithRedisTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/component/LanguageStatsListenerTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/component/bucket/TokenBucketManagerTestWithRedis.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/security/rateLimits/RateLimitsTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/security/rateLimits/RedisRateLimitsTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/service/ActivityVIewByRevisionsProviderTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/service/ExportServiceTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/service/ImageUploadServiceTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/service/LanguageServiceTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/service/ProjectStatsServiceTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/service/TranslationServiceTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/service/organizationRole/OrganizationRoleCachingWithRedisTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/service/queryBuilders/CursorUtilUnitTest.kt (content)
⚔️ backend/app/src/test/kotlin/io/tolgee/websocket/WebsocketWithRedisTest.kt (content)
⚔️ backend/app/src/test/resources/application.yaml (content)
⚔️ backend/data/build.gradle (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/Metrics.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/activity/ActivityHolder.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/activity/ActivityService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/activity/data/ActivityType.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/activity/iterceptor/InterceptedEventsManager.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/activity/iterceptor/PreCommitEventPublisher.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/activity/projectActivity/ActivityViewByRevisionsProvider.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/activity/projectActivity/ModificationsByRevisionsProvider.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/activity/projectActivity/ProjectActivityViewByPageableProvider.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/activity/projectActivity/ProjectActivityViewByRevisionProvider.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/batch/BatchJobActionService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/batch/BatchJobConcurrentLauncher.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/batch/ChunkProcessingUtil.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/batch/ProgressManager.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/component/CacheCleaner.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/component/eventListeners/LanguageStatsListener.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/configuration/tolgee/RateLimitProperties.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/constants/Feature.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/constants/Message.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/TestDataService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/builders/ProjectBuilder.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/data/KeySearchTestData.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/data/KeysTestData.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/data/ProjectStatsTestData.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/data/ProjectTranslationsStatsTestData.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/data/ProjectsTestData.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/data/TagsTestData.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/data/TranslationsTestData.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/data/dataImport/ImportTestData.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/ExportParamsDocs.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/IExportParams.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/RelatedKeyDto.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/cacheable/ProjectDto.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/dataImport/IImportAddFilesParams.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/dataImport/ImportAddFilesParams.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/queryResults/KeyIdFindResult.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/queryResults/KeyView.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/queryResults/LanguageStatsDto.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/request/ContentDeliveryConfigRequest.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/request/export/ExportParams.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/request/key/ComplexEditKeyDto.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/request/key/CreateKeyDto.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/request/key/EditKeyDto.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/request/project/EditProjectRequest.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/request/translation/SetTranslationsWithKeyDto.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/request/translation/TranslationFilters.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/dtos/request/translation/importKeysResolvable/ImportKeysResolvableItemDto.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/formats/MobileStringEscaper.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/formats/apple/out/AppleXcstringsExporter.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/formats/xmlResources/out/TextToXmlResourcesConvertor.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/Language.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/LanguageStats.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/Project.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/activity/ActivityModifiedEntity.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/contentDelivery/ContentDeliveryConfig.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/dataImport/Import.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/enums/Scope.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/key/Key.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/key/KeyComment.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/key/KeyMeta.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/key/screenshotReference/KeyScreenshotReference.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/task/Task.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/translation/Translation.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/views/KeyWithTranslationsView.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/views/ProjectView.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/views/ProjectWithLanguagesView.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/views/ProjectWithStatsView.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/model/views/TaskWithScopeView.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/repository/KeyMetaRepository.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/repository/KeyRepository.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/repository/LanguageStatsRepository.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/repository/ProjectRepository.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/repository/TranslationRepository.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/repository/activity/ActivityModifiedEntityRepository.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/repository/activity/ActivityRevisionRepository.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/repository/dataImport/ImportRepository.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/repository/dataImport/ImportTranslationRepository.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/security/ratelimit/Bucket.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/security/ratelimit/RateLimitService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/security/ratelimit/RateLimitedException.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/bigMeta/BigMetaService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/bigMeta/KeysDistanceUtil.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/dataImport/ImportDataManager.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/dataImport/ImportService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/dataImport/StoredDataImporter.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/export/ExportService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/export/FileExporterFactory.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/export/dataProvider/ExportDataProvider.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/key/ComplexTagOperationKeyProvider.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/key/KeyService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/key/ResolvingKeyImporter.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/key/TagService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/key/utils/KeyInfoProvider.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/key/utils/KeysImporter.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/language/LanguageHardDeleter.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/organization/OrganizationStatsService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/project/LanguageStatsService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/project/ProjectCreationService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/project/ProjectHardDeletingService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/project/ProjectService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/project/ProjectStatsService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/queryBuilders/LanguageStatsProvider.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/queryBuilders/ProjectStatsProvider.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/queryBuilders/translationViewBuilder/QueryBase.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/queryBuilders/translationViewBuilder/QueryGlobalFiltering.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/security/SecurityService.kt (content)
⚔️ backend/data/src/main/kotlin/io/tolgee/service/translation/TranslationService.kt (content)
⚔️ backend/data/src/main/resources/db/changelog/schema.xml (content)
⚔️ backend/data/src/test/kotlin/io/tolgee/security/ratelimit/RateLimitServiceTest.kt (content)
⚔️ backend/data/src/test/kotlin/io/tolgee/unit/CoreImportFileProcessorUnitTest.kt (content)
⚔️ backend/data/src/test/kotlin/io/tolgee/unit/bigMeta/KeysDistanceUnitTestData.kt (content)
⚔️ backend/data/src/test/kotlin/io/tolgee/unit/formats/compose/out/ComposeXmlFileExporterTest.kt (content)
⚔️ backend/data/src/test/kotlin/io/tolgee/unit/formats/compose/out/TextToComposeXmlConvertorTest.kt (content)
⚔️ backend/security/src/main/kotlin/io/tolgee/security/authorization/ProjectAuthorizationInterceptor.kt (content)
⚔️ backend/security/src/main/kotlin/io/tolgee/security/ratelimit/GlobalIpRateLimitFilter.kt (content)
⚔️ backend/security/src/main/kotlin/io/tolgee/security/ratelimit/GlobalUserRateLimitFilter.kt (content)
⚔️ backend/security/src/test/kotlin/io/tolgee/security/authorization/ProjectAuthorizationInterceptorTest.kt (content)
⚔️ backend/security/src/test/kotlin/io/tolgee/security/ratelimit/GlobalIpRateLimitFilterTest.kt (content)
⚔️ backend/security/src/test/kotlin/io/tolgee/security/ratelimit/GlobalUserRateLimitFilterTest.kt (content)
⚔️ backend/security/src/test/kotlin/io/tolgee/security/ratelimit/RateLimitInterceptorTest.kt (content)
⚔️ backend/testing/src/main/kotlin/io/tolgee/fixtures/ProjectApiKeyAuthRequestPerformer.kt (content)
⚔️ backend/testing/src/main/kotlin/io/tolgee/fixtures/RedisRunner.kt (content)
⚔️ backend/testing/src/main/kotlin/io/tolgee/fixtures/redisTesting.kt (content)
⚔️ backend/testing/src/main/kotlin/io/tolgee/fixtures/statusExpectations.kt (content)
⚔️ docs/local-observability-stack/1_Setting_Up_the_Tracing_Stack.md (content)
⚔️ docs/observability/README.md (content)
⚔️ e2e/README.md (content)
⚔️ e2e/cypress/common/apiCalls/common.ts (content)
⚔️ e2e/cypress/common/apiCalls/testData/testData.ts (content)
⚔️ e2e/cypress/common/export.ts (content)
⚔️ e2e/cypress/common/import.ts (content)
⚔️ e2e/cypress/common/singleKey.ts (content)
⚔️ e2e/cypress/common/tasks.ts (content)
⚔️ e2e/cypress/common/translations.ts (content)
⚔️ e2e/cypress/support/dataCyType.d.ts (content)
⚔️ e2e/cypress/support/e2e.ts (content)
⚔️ e2e/docker-compose.yml (content)
⚔️ ee/backend/app/src/main/kotlin/io/tolgee/ee/api/v2/controllers/TaskController.kt (content)
⚔️ ee/backend/app/src/main/kotlin/io/tolgee/ee/api/v2/hateoas/assemblers/TaskModelAssembler.kt (content)
⚔️ ee/backend/app/src/main/kotlin/io/tolgee/ee/api/v2/hateoas/assemblers/TaskWithProjectModelAssembler.kt (content)
⚔️ ee/backend/app/src/main/kotlin/io/tolgee/ee/data/task/CalculateScopeRequest.kt (content)
⚔️ ee/backend/app/src/main/kotlin/io/tolgee/ee/data/task/CreateTaskRequest.kt (content)
⚔️ ee/backend/app/src/main/kotlin/io/tolgee/ee/data/task/TaskFilters.kt (content)
⚔️ ee/backend/app/src/main/kotlin/io/tolgee/ee/repository/TaskRepository.kt (content)
⚔️ ee/backend/app/src/main/kotlin/io/tolgee/ee/service/LabelServiceImpl.kt (content)
⚔️ ee/backend/app/src/main/kotlin/io/tolgee/ee/service/TaskService.kt (content)
⚔️ ee/backend/tests/src/test/resources/application.yaml (content)
⚔️ gradle.properties (content)
⚔️ gradle/e2e.gradle (content)
⚔️ settings.gradle (content)
⚔️ webapp/src/ThemeProvider.tsx (content)
⚔️ webapp/src/component/CustomIcons.tsx (content)
⚔️ webapp/src/component/PermissionsSettings/usePermissionsStructure.ts (content)
⚔️ webapp/src/component/PermissionsSettings/useScopeTranslations.tsx (content)
⚔️ webapp/src/component/activity/ActivityDetail/ActivityDetailDialog.tsx (content)
⚔️ webapp/src/component/activity/ActivityTitle.tsx (content)
⚔️ webapp/src/component/activity/activityEntities.tsx (content)
⚔️ webapp/src/component/activity/activityTools.tsx (content)
⚔️ webapp/src/component/activity/configuration.tsx (content)
⚔️ webapp/src/component/activity/formatTools.tsx (content)
⚔️ webapp/src/component/activity/references/AnyReference.tsx (content)
⚔️ webapp/src/component/activity/types.tsx (content)
⚔️ webapp/src/component/common/LabelHint.tsx (content)
⚔️ webapp/src/component/common/form/StandardForm.tsx (content)
⚔️ webapp/src/component/layout/QuickStartGuide/StyledComponents.tsx (content)
⚔️ webapp/src/component/navigation/Navigation.tsx (content)
⚔️ webapp/src/component/searchSelect/InfiniteSearchSelect.tsx (content)
⚔️ webapp/src/constants/GlobalValidationSchema.tsx (content)
⚔️ webapp/src/constants/links.tsx (content)
⚔️ webapp/src/ee/batchOperations/OperationTaskCreate.tsx (content)
⚔️ webapp/src/ee/glossary/hooks/useGlossaryExport.ts (content)
⚔️ webapp/src/ee/llm/AiPrompt/AiResultUsage.tsx (content)
⚔️ webapp/src/ee/orderTranslations/OrderTranslationsDialog.tsx (content)
⚔️ webapp/src/ee/task/components/BoardItem.tsx (content)
⚔️ webapp/src/ee/task/components/PrefilterTask.tsx (content)
⚔️ webapp/src/ee/task/components/TaskDetail.tsx (content)
⚔️ webapp/src/ee/task/components/TaskId.tsx (content)
⚔️ webapp/src/ee/task/components/TaskItem.tsx (content)
⚔️ webapp/src/ee/task/components/TaskLabel.tsx (content)
⚔️ webapp/src/ee/task/components/TaskMenu.tsx (content)
⚔️ webapp/src/ee/task/components/TaskTooltip.tsx (content)
⚔️ webapp/src/ee/task/components/TasksBoard.tsx (content)
⚔️ webapp/src/ee/task/components/taskCreate/TaskCreateDialog.tsx (content)
⚔️ webapp/src/ee/task/components/taskCreate/TaskCreateForm.tsx (content)
⚔️ webapp/src/ee/task/views/projectTasks/ProjectTasksBoard.tsx (content)
⚔️ webapp/src/ee/task/views/projectTasks/ProjectTasksList.tsx (content)
⚔️ webapp/src/ee/task/views/projectTasks/ProjectTasksView.tsx (content)
⚔️ webapp/src/eeSetup/EeModuleType.ts (content)
⚔️ webapp/src/eeSetup/eeModule.ee.tsx (content)
⚔️ webapp/src/eeSetup/eeModule.oss.tsx (content)
⚔️ webapp/src/fixtures/getPermissionTools.ts (content)
⚔️ webapp/src/fixtures/permissions.ts (content)
⚔️ webapp/src/i18n/cs.json (content)
⚔️ webapp/src/i18n/da.json (content)
⚔️ webapp/src/i18n/de.json (content)
⚔️ webapp/src/i18n/en.json (content)
⚔️ webapp/src/i18n/es.json (content)
⚔️ webapp/src/i18n/fr.json (content)
⚔️ webapp/src/i18n/hu.json (content)
⚔️ webapp/src/i18n/it-IT.json (content)
⚔️ webapp/src/i18n/ja.json (content)
⚔️ webapp/src/i18n/nl.json (content)
⚔️ webapp/src/i18n/no.json (content)
⚔️ webapp/src/i18n/pl.json (content)
⚔️ webapp/src/i18n/pt.json (content)
⚔️ webapp/src/i18n/ro.json (content)
⚔️ webapp/src/i18n/uk-UA.json (content)
⚔️ webapp/src/i18n/zh.json (content)
⚔️ webapp/src/service/apiSchema.generated.ts (content)
⚔️ webapp/src/service/billingApiSchema.generated.ts (content)
⚔️ webapp/src/translationTools/useErrorTranslation.ts (content)
⚔️ webapp/src/translationTools/useFeatures.tsx (content)
⚔️ webapp/src/views/projects/BaseProjectView.tsx (content)
⚔️ webapp/src/views/projects/ProjectRouter.tsx (content)
⚔️ webapp/src/views/projects/TaskRedirect.tsx (content)
⚔️ webapp/src/views/projects/dashboard/DashboardView.tsx (content)
⚔️ webapp/src/views/projects/export/ExportForm.tsx (content)
⚔️ webapp/src/views/projects/export/ExportView.tsx (content)
⚔️ webapp/src/views/projects/export/downloadExported.ts (content)
⚔️ webapp/src/views/projects/import/ImportView.tsx (content)
⚔️ webapp/src/views/projects/import/component/ImportFileInput.tsx (content)
⚔️ webapp/src/views/projects/import/component/ImportProgressOverlay.tsx (content)
⚔️ webapp/src/views/projects/import/component/ImportSettingsPanel.tsx (content)
⚔️ webapp/src/views/projects/import/hooks/useApplyImportHelper.tsx (content)
⚔️ webapp/src/views/projects/import/hooks/useImportDataHelper.tsx (content)
⚔️ webapp/src/views/projects/project/ProjectSettingsAdvanced.tsx (content)
⚔️ webapp/src/views/projects/project/ProjectSettingsGeneral.tsx (content)
⚔️ webapp/src/views/projects/projectMenu/ProjectMenu.tsx (content)
⚔️ webapp/src/views/projects/translations/BatchOperations/OperationExportTranslations.tsx (content)
⚔️ webapp/src/views/projects/translations/BatchOperations/OperationOrderTranslation.tsx (content)
⚔️ webapp/src/views/projects/translations/BatchOperations/operations.tsx (content)
⚔️ webapp/src/views/projects/translations/KeyCreateForm/KeyCreateForm.tsx (content)
⚔️ webapp/src/views/projects/translations/KeySingle/KeyEditForm.tsx (content)
⚔️ webapp/src/views/projects/translations/KeySingle/KeySingle.tsx (content)
⚔️ webapp/src/views/projects/translations/SingleKeyView.tsx (content)
⚔️ webapp/src/views/projects/translations/ToolsPanel/usePanelData.ts (content)
⚔️ webapp/src/views/projects/translations/TranslationFilters/SubfilterLabels.tsx (content)
⚔️ webapp/src/views/projects/translations/TranslationFilters/TranslationFilters.tsx (content)
⚔️ webapp/src/views/projects/translations/TranslationFilters/summary.ts (content)
⚔️ webapp/src/views/projects/translations/TranslationHeader/TranslationControls.tsx (content)
⚔️ webapp/src/views/projects/translations/Translations.tsx (content)
⚔️ webapp/src/views/projects/translations/TranslationsList/CellTranslation.tsx (content)
⚔️ webapp/src/views/projects/translations/TranslationsList/RowList.tsx (content)
⚔️ webapp/src/views/projects/translations/TranslationsList/TranslationLabels.tsx (content)
⚔️ webapp/src/views/projects/translations/TranslationsList/TranslationRead.tsx (content)
⚔️ webapp/src/views/projects/translations/TranslationsTable/RowTable.tsx (content)
⚔️ webapp/src/views/projects/translations/TranslationsView.tsx (content)
⚔️ webapp/src/views/projects/translations/cell/TranslationFlags.tsx (content)
⚔️ webapp/src/views/projects/translations/context/TranslationsContext.ts (content)
⚔️ webapp/src/views/projects/translations/context/services/useAiPlaygroundService.tsx (content)
⚔️ webapp/src/views/projects/translations/context/services/useEditService.tsx (content)
⚔️ webapp/src/views/projects/translations/context/services/useLabelsService.tsx (content)
⚔️ webapp/src/views/projects/translations/context/services/useTranslationsService.tsx (content)
⚔️ webapp/src/views/projects/translations/context/shortcuts/useTranslationsShortcuts.ts (content)
⚔️ webapp/src/views/projects/translations/prefilters/PrefilterActivity.tsx (content)
⚔️ webapp/src/views/projects/translations/useTranslationCell.ts (content)
⚔️ webapp/vite.config.ts (content)

These conflicts must be resolved before merging into main.
Resolve conflicts locally and push changes to this branch.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: adding a way to run a local observability stack with Tolgee outside Docker, which is supported by new Gradle tasks, Docker Compose file, and documentation updates.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch jirikuchynka/local-observability-dev
⚔️ Resolve merge conflicts (beta)
  • Auto-commit resolved conflicts to branch jirikuchynka/local-observability-dev
  • Create stacked PR with resolved conflicts
  • Post resolved changes as copyable diffs in a comment

No actionable comments were generated in the recent review. 🎉


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@backend/app/build.gradle`:
- Around line 309-342: The bootRunWithObservability task currently only sets
OTEL_* environment vars in doFirst, but bootRun reads
System.getenv("OTEL_JAVAAGENT_ENABLED") at configuration time so the Java agent
never gets added; update bootRunWithObservability (and/or its doFirst block) to
explicitly append the javaagent JVM arg to bootRun.jvmArgs (e.g., add
"-javaagent:<path-to-opentelemetry-javaagent.jar>") so the agent is attached to
the JVM that runs the app, while keeping the existing environment(...) OTEL
settings; reference the bootRunWithObservability task and the bootRun.jvmArgs
property when making this change.

In `@docs/observability/README.md`:
- Around line 34-37: Update the "Method" column entry that currently reads
`./gradlew server-app:bootRun` to match the actual command used (`./gradlew
server-app:bootRunWithObservability`) in the table row where the How cell
contains `./gradlew server-app:bootRunWithObservability
--args='--spring.profiles.active=dev'`, so the Method label and the command
string are consistent.
🧹 Nitpick comments (2)
docker/docker-compose.local-observability-stack-dev.yaml (1)

79-103: Consider limiting Grafana exposure when anonymous admin is enabled.
Binding the UI to localhost reduces accidental LAN exposure while keeping the dev UX intact.

🛠️ Suggested hardening
-      - "3000:3000"
+      - "127.0.0.1:3000:3000"
docs/local-observability-stack/1_Setting_Up_the_Tracing_Stack.md (1)

59-91: Drop the redundant --args for the dev profile.
bootRunWithObservability already sets --spring.profiles.active=dev, so repeating it is unnecessary.

✏️ Suggested edit
-./gradlew server-app:bootRunWithObservability --args='--spring.profiles.active=dev'
+./gradlew server-app:bootRunWithObservability

Comment on lines +34 to +37
| Method | Use Case | How |
|--------------------------------|---------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `./gradlew server-app:bootRun` | Local development, quick iteration | `docker compose -f docker-compose.local-observability-stack-dev.yaml up -d && ./gradlew server-app:bootRunWithObservability --args='--spring.profiles.active=dev'` |
| Docker (full stack) | Testing the full stack, CI, production-like | `docker compose -f docker-compose.local-observability-stack.yaml up -d` |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

cat -n docs/observability/README.md | head -50

Repository: tolgee/tolgee-platform

Length of output: 3363


Align the "Method" label with the command shown.

The Method column shows ./gradlew server-app:bootRun, but the command uses ./gradlew server-app:bootRunWithObservability. Update the Method label to match.

✏️ Suggested edit
-| `./gradlew server-app:bootRun` | Local development, quick iteration          | `docker compose -f docker-compose.local-observability-stack-dev.yaml up -d && ./gradlew server-app:bootRunWithObservability --args='--spring.profiles.active=dev'` |
+| `./gradlew server-app:bootRunWithObservability` | Local development, quick iteration          | `docker compose -f docker-compose.local-observability-stack-dev.yaml up -d && ./gradlew server-app:bootRunWithObservability --args='--spring.profiles.active=dev'` |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| Method | Use Case | How |
|--------------------------------|---------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `./gradlew server-app:bootRun` | Local development, quick iteration | `docker compose -f docker-compose.local-observability-stack-dev.yaml up -d && ./gradlew server-app:bootRunWithObservability --args='--spring.profiles.active=dev'` |
| Docker (full stack) | Testing the full stack, CI, production-like | `docker compose -f docker-compose.local-observability-stack.yaml up -d` |
| Method | Use Case | How |
|-----------------------------------------------------|---------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `./gradlew server-app:bootRunWithObservability` | Local development, quick iteration | `docker compose -f docker-compose.local-observability-stack-dev.yaml up -d && ./gradlew server-app:bootRunWithObservability --args='--spring.profiles.active=dev'` |
| Docker (full stack) | Testing the full stack, CI, production-like | `docker compose -f docker-compose.local-observability-stack.yaml up -d` |
🤖 Prompt for AI Agents
In `@docs/observability/README.md` around lines 34 - 37, Update the "Method"
column entry that currently reads `./gradlew server-app:bootRun` to match the
actual command used (`./gradlew server-app:bootRunWithObservability`) in the
table row where the How cell contains `./gradlew
server-app:bootRunWithObservability --args='--spring.profiles.active=dev'`, so
the Method label and the command string are consistent.

gabrielshanahan
gabrielshanahan previously approved these changes Feb 3, 2026
Copy link
Contributor

@gabrielshanahan gabrielshanahan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just one nit, otherwise LGTM and :shipit:


// Copy OTEL agent to a predictable location for IntelliJ usage
// See: docs/observability/
tasks.register('copyOtelAgent', Copy) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this actually used anywhere - it should imho either be called as part of something, mentioned in the docs, or removed

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's used by the IntelliJ IDEA runner in the other repo, though I'm not sure myself if it's required.

The previous approach set OTEL_JAVAAGENT_ENABLED via `environment` in a
doFirst block, but bootRun's System.getenv() check runs at Gradle
configuration time (before any task executes), so the javaagent flag was
never added. Fix by adding jvmArgs directly in the doFirst block.

Also clarify copyOtelAgent comment: it's a standalone helper for IntelliJ
run configurations, not used by bootRun or bootRunWithObservability.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
dkrizan
dkrizan previously approved these changes Feb 12, 2026
…rework it so it can be used as a drop in replacement for bootRun
@Anty0 Anty0 force-pushed the jirikuchynka/local-observability-dev branch from 66d2e1c to 0fdae14 Compare February 13, 2026 16:35
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@backend/app/build.gradle`:
- Around line 301-310: The task 'copyOtelAgent' uses the deprecated buildDir;
change the destination to use the project layout API instead—replace the into
"${buildDir}/otel" usage with the layout.buildDirectory.dir("otel") (or an
equivalent DirectoryProvider) so the Copy task receives a modern
Directory/Provider; keep the rest of the task (from configurations.otelAgent,
rename, and the task name copyOtelAgent) unchanged.
🧹 Nitpick comments (1)
backend/app/build.gradle (1)

337-343: Convert environment variable names to uppercase with underscores for POSIX compliance and Spring Boot best practices.

Environment variables with dots in their names are non-POSIX compliant and not portable across all systems. Spring Boot's own documentation explicitly recommends converting property names to uppercase with underscores: dots become underscores, dashes are removed, and everything is uppercased (e.g., spring.datasource.urlSPRING_DATASOURCE_URL). While Spring's relaxed binding may allow the current naming to work on some systems, this approach is inconsistent with the OTEL variables in the same file and deviates from Spring Boot's documented best practices.

Use standard Spring Boot environment variable naming
             // Database configuration (use Docker stack's PostgreSQL/Redis)
-            environment 'spring.datasource.url', 'jdbc:postgresql://localhost:5432/tolgee'
-            environment 'spring.datasource.username', 'tolgee'
-            environment 'spring.datasource.password', 'tolgee'
-            environment 'spring.redis.host', 'localhost'
-            environment 'spring.redis.port', '6379'
-            environment 'spring.redis.password', 'tolgee'
-            environment 'tolgee.postgres-autostart.enabled', 'false'
+            environment 'SPRING_DATASOURCE_URL', 'jdbc:postgresql://localhost:5432/tolgee'
+            environment 'SPRING_DATASOURCE_USERNAME', 'tolgee'
+            environment 'SPRING_DATASOURCE_PASSWORD', 'tolgee'
+            environment 'SPRING_REDIS_HOST', 'localhost'
+            environment 'SPRING_REDIS_PORT', '6379'
+            environment 'SPRING_REDIS_PASSWORD', 'tolgee'
+            environment 'TOLGEE_POSTGRES_AUTOSTART_ENABLED', 'false'

Comment on lines +301 to +310
// Copy OTEL agent JAR to a predictable location for manual IntelliJ run configuration.
// Not used by bootRun or bootRunWithObservability (they resolve the agent from Gradle's dependency cache).
// Usage: ./gradlew server-app:copyOtelAgent → build/otel/opentelemetry-javaagent.jar
// Then add -javaagent:backend/app/build/otel/opentelemetry-javaagent.jar to your IntelliJ VM options.
// See: docs/observability/
tasks.register('copyOtelAgent', Copy) {
from configurations.otelAgent
into "${buildDir}/otel"
rename { 'opentelemetry-javaagent.jar' }
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify Gradle project structure and task path
echo "=== Checking for settings.gradle files ==="
fd -t f 'settings\.gradle' --max-depth 3

echo -e "\n=== Checking settings.gradle content ==="
find . -maxdepth 3 -name 'settings.gradle*' -exec cat {} \;

echo -e "\n=== Checking backend directory structure ==="
ls -la backend/ 2>/dev/null | head -20

echo -e "\n=== Checking if server-app directory exists ==="
find . -maxdepth 3 -type d -name '*server*app*' -o -type d -name 'server-app'

echo -e "\n=== Checking for other Gradle task invocations ==="
rg 'gradlew.*copyOtelAgent|gradlew.*bootRun' --max-count 10

Repository: tolgee/tolgee-platform

Length of output: 8912


🏁 Script executed:

#!/bin/bash
# Verify buildDir usage and deprecation
echo "=== Checking Gradle version and buildDir patterns ==="
grep -r "gradle\|buildDir\|layout.buildDirectory" gradle.properties settings.gradle 2>/dev/null | head -20

echo -e "\n=== Checking buildDir usage in build.gradle files ==="
rg 'buildDir|layout\.buildDirectory' backend/ --type gradle --max-count 15

echo -e "\n=== Checking environment variable naming in bootRun tasks ==="
rg 'environment.*SPRING|spring\.' backend/app/build.gradle -A 2 -B 2

Repository: tolgee/tolgee-platform

Length of output: 2923


🏁 Script executed:

#!/bin/bash
# Verify the correct module naming in Gradle
echo "=== Checking gradle wrapper and build files ==="
find . -maxdepth 2 -name 'gradle.properties' -o -name 'build.gradle' | head -10 | xargs head -5

echo -e "\n=== Checking if 'app' module exists in backend ==="
test -f backend/app/build.gradle && echo "backend/app/build.gradle EXISTS" || echo "NOT FOUND"

echo -e "\n=== Checking gradle tasks available ==="
grep -E "tasks\.(register|create)" backend/app/build.gradle | grep -E 'copyOtel|bootRun' | head -5

Repository: tolgee/tolgee-platform

Length of output: 561


Minor: Deprecated buildDir usage.

buildDir is deprecated in Gradle 7.1+ in favor of layout.buildDirectory. The comment and task path ./gradlew server-app:copyOtelAgent are correct as-is—the backend/app directory is mapped to the :server-app project in settings.gradle.

Suggested fix
 tasks.register('copyOtelAgent', Copy) {
     from configurations.otelAgent
-    into "${buildDir}/otel"
+    into layout.buildDirectory.dir("otel")
     rename { 'opentelemetry-javaagent.jar' }
 }
🤖 Prompt for AI Agents
In `@backend/app/build.gradle` around lines 301 - 310, The task 'copyOtelAgent'
uses the deprecated buildDir; change the destination to use the project layout
API instead—replace the into "${buildDir}/otel" usage with the
layout.buildDirectory.dir("otel") (or an equivalent DirectoryProvider) so the
Copy task receives a modern Directory/Provider; keep the rest of the task (from
configurations.otelAgent, rename, and the task name copyOtelAgent) unchanged.

@Anty0 Anty0 merged commit ccd4372 into main Feb 15, 2026
97 of 103 checks passed
@Anty0 Anty0 deleted the jirikuchynka/local-observability-dev branch February 15, 2026 12:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

Comments