Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
42eb2cb
Add repository information overview
granstel Jul 1, 2025
2d3ef4b
upgraded framework and packages
granstel Jul 1, 2025
2d2a46d
OpenTracing replaced with OpenTelemetry
granstel Jul 1, 2025
b90ed54
fixes
granstel Jul 1, 2025
7675520
fixes
granstel Jul 1, 2025
1731801
fixed test
granstel Jul 1, 2025
d8f7056
fixed test
granstel Jul 1, 2025
d11c441
fixed test
granstel Jul 1, 2025
475d9e9
fixed test
granstel Jul 1, 2025
8842df6
formatting
granstel Jul 1, 2025
5a99854
primary constructors
granstel Jul 1, 2025
325375e
removed NUnitAssertUsings.cs and fixed test
granstel Jul 2, 2025
0e7227d
refactored test
granstel Jul 2, 2025
26c7f03
removed NUnitAssertUsings.cs and refactored test
granstel Jul 2, 2025
c918cf5
Google.Cloud.Dialogflow.V2 4.26.0
granstel Jul 2, 2025
0aab5b5
Microsoft.Extensions.Configuration.Binder 9.0.6
granstel Jul 2, 2025
0665437
prometheus-net replaced with OpenTelemetry.Exporter.Prometheus
granstel Jul 2, 2025
84db08b
set required port
granstel Jul 2, 2025
ce80e30
refactored
granstel Jul 2, 2025
ff0eb68
"Microsoft.Extensions.Configuration.FileExtensions" Version="9.0.6"
granstel Jul 2, 2025
066ddbd
"Microsoft.Extensions.Configuration.Json" Version="9.0.6"
granstel Jul 2, 2025
c3d75cc
"Microsoft.Extensions.Logging.Abstractions" Version="9.0.6"
granstel Jul 2, 2025
20ca785
"Microsoft.NET.Test.Sdk" Version="17.14.1"
granstel Jul 2, 2025
d4d2298
"Moq" Version="4.20.72"
granstel Jul 2, 2025
1736e6c
"nunit" Version="4.3.2"
granstel Jul 2, 2025
e27eafe
"NUnit3TestAdapter" Version="5.0.0"
granstel Jul 2, 2025
ebd9c50
"OpenTelemetry.Instrumentation.Runtime" Version="1.12.0"
granstel Jul 2, 2025
36713ba
"StackExchange.Redis" Version="2.8.41"
granstel Jul 2, 2025
82ace2b
System.ServiceModel 8.1.2
granstel Jul 2, 2025
a45e45c
Directory.Packages.props
granstel Jul 2, 2025
ca1e486
slnx
granstel Jul 2, 2025
d2fea78
Revert "slnx"
granstel Jul 7, 2025
277a381
upgraded dependencies
granstel Jul 19, 2025
6201718
slnx
granstel Jul 19, 2025
0ce618e
e2e tests
granstel Jul 20, 2025
fc24776
try to fix e2e-tests
granstel Jul 20, 2025
361ca29
Revert "try to fix e2e-tests"
granstel Jul 20, 2025
dced9ed
Revert "e2e tests"
granstel Jul 20, 2025
aff2b66
fixed memory leaks
granstel Jul 20, 2025
a5587e9
rasa as dialogflow emulator
granstel Jul 20, 2025
521b682
integrated with Rasa
granstel Jul 20, 2025
31bc217
Revert "integrated with Rasa"
granstel Jul 20, 2025
7ed1028
Revert "rasa as dialogflow emulator"
granstel Jul 20, 2025
42aa852
dialogflow emulator
granstel Jul 20, 2025
2625da6
dialogflow_emulator_upgrade_plan.md
granstel Nov 4, 2025
225ed91
updated packges
granstel Nov 4, 2025
56a6e01
added redis to docker-compose
granstel Nov 4, 2025
d9a9704
added plan
granstel Nov 4, 2025
33062e3
removed IncomingToken env var expectation
granstel Nov 4, 2025
2be639c
Dialogflow.Emulator
granstel Nov 4, 2025
3d2bba2
AgentStorage
granstel Nov 4, 2025
793ca61
IntentMatcher
granstel Nov 4, 2025
671f290
DialogflowEmulatorService
granstel Nov 4, 2025
e1e5c3a
integration with emulator
granstel Nov 4, 2025
8fd1487
added Dockerfile
granstel Nov 4, 2025
af77d02
Dialogflow.Emulator.IntegrationTests
granstel Nov 4, 2025
5d9cb0b
copy packages to decrease restore
granstel Nov 4, 2025
db5b305
fixed tests running
granstel Nov 4, 2025
4f1a3e8
try to fix call emulator from tests
granstel Nov 4, 2025
e7f93ff
worked simple client
granstel Nov 5, 2025
e95e449
removed nodejs emulator
granstel Nov 5, 2025
febef64
client works
granstel Nov 5, 2025
7f53467
test work with runned emulator on host
granstel Nov 5, 2025
703ac8c
test work with runned emulator in container
granstel Nov 5, 2025
ec403a9
removed redundant files
granstel Nov 5, 2025
b3585ee
removed appveyor.yml
granstel Nov 5, 2025
607ca67
changed build&test.yml
granstel Nov 5, 2025
0ec6378
fixed build&test.yml
granstel Nov 5, 2025
3815d5b
don't copy packages
granstel Nov 5, 2025
e77482b
fixed clients build for working with emulator
granstel Nov 5, 2025
494cc54
Development configuration
granstel Nov 6, 2025
44deb56
Development configuration
granstel Nov 6, 2025
2d16bdf
CI configuration
granstel Nov 6, 2025
6119497
removed Logging section
granstel Nov 6, 2025
756feb0
CI configuration
granstel Nov 6, 2025
c625a48
updated Google.Cloud.Dialogflow.V2
granstel Nov 9, 2025
f64bcb7
updated NLog
granstel Nov 9, 2025
64b58a7
added launchSettings.json
granstel Nov 11, 2025
c615f4c
set ASPNETCORE_URLS for dialogflow-emulator at docker-compose.yml
granstel Nov 11, 2025
fb27349
change ports
granstel Nov 11, 2025
e5c465b
security params
granstel Nov 11, 2025
b746990
Build image, Compose, and Push to hub at pipeline
granstel Nov 11, 2025
0d955be
repository name at lowercase
granstel Nov 11, 2025
8291b21
try to fix compose
granstel Nov 11, 2025
2a5103b
Revert "try to fix compose"
granstel Nov 11, 2025
ace0dbf
Update build&test.yml
granstel Nov 13, 2025
d557251
Update build&test.yml
granstel Nov 13, 2025
3b858a4
Rename docker-compose.CI.yml to docker-compose.ci.yml
granstel Nov 13, 2025
e7fe291
Update build&test.yml
granstel Nov 13, 2025
dd36eb6
fixed file name
granstel Nov 13, 2025
2e1e9a4
Update build&test.yml
granstel Nov 14, 2025
e37d1b8
added integration test
granstel Nov 14, 2025
c3976d1
try to run service for integration test
granstel Nov 18, 2025
d735e94
StartFitbWithWebApplicationFactory
granstel Nov 20, 2025
9429a08
Microsoft packages
granstel Dec 2, 2025
4d94032
Testcontainers
granstel Dec 2, 2025
042db20
OpenTelemetry.Api
granstel Dec 2, 2025
d520d76
StackExchange.Redis
granstel Dec 2, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Git
.git
.gitignore

# Documentation
*.md
README.md
DIALOGFLOW_EMULATOR.md

# IDE files
.vs/
.vscode/
.idea/
*.suo
*.user
*.userprefs
*.sln.docstates

# Build artifacts
bin/
obj/
out/
target/

# Node modules (except in dialogflow-emulator)
node_modules/
!dialogflow-emulator/node_modules/

# Logs
*.log
logs/

# Temporary files
tmp/
temp/
.tmp/

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Application specific
appsettings.*.json
!appsettings.json
!appsettings.Local.json

# Test results
TestResults/
[Tt]est[Rr]esults*/

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# NuGet
*.nupkg
*.snupkg
.nuget/
71 changes: 67 additions & 4 deletions .github/workflows/build&test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,73 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v5

- name: Setup .NET
uses: actions/setup-dotnet@v1
uses: actions/setup-dotnet@v5
with:
dotnet-version: 6.0.x
dotnet-version: 9.0.x

- name: Build and test
run: dotnet test --verbosity normal src/FillInTheTextBot.sln
run: dotnet test --verbosity normal FillInTheTextBot.slnx

- name: Publish
run: dotnet publish --configuration Release --output ./output src/FillInTheTextBot.Api/FillInTheTextBot.Api.csproj

- name: Build image
uses: docker/build-push-action@v6.18.0
with:
tags: granstel/fillinthetextbot:latest
load: true
push: false
context: .
file: src/FillInTheTextBot.Api/Dockerfile

- name: Compose
uses: hoverkraft-tech/compose-action@3846bcd61da338e9eaaf83e7ed0234a12b099b72
with:
compose-file: docker-compose.ci.yml
up-flags: --build

- name: Collect per-service logs
if: always()
run: |
mkdir -p compose-logs
for s in $(docker compose -f docker-compose.ci.yml config --services); do
echo "Collecting logs for $s"
docker compose -f docker-compose.ci.yml logs --no-color -t "$s" > "compose-logs/${s}.log" || true
done

- name: Upload per-service logs folder
if: failure()
uses: actions/upload-artifact@v4.6.2
with:
name: compose-logs
path: compose-logs
retention-days: 7

- name: Collect docker-compose.log
if: always()
run: docker compose -f docker-compose.ci.yml logs -t >> docker-compose.log || true
- name: Upload docker-compose.log
if: always()
uses: actions/upload-artifact@v4.6.2
with:
name: docker-compose.log
path: docker-compose.log
retention-days: 7

- name: Login to Docker Hub
if: ${{ github.ref == 'refs/heads/main' }}
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Push to hub
if: ${{ github.ref == 'refs/heads/main' }}
uses: docker/build-push-action@v6.18.0
with:
context: .
tags: granstel/fillinthetextbot:latest
push: true
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
**/Keys/
**/deploy/
**/.config/
**/Properties/
/src/FillInTheTextBot.Api/FillInTheTextBot.Api.csproj.user
/src/FillInTheTextBot.Api/fillinthetextbot-test-bctxpk-bb6ea1e87cd1.json
/src/FillInTheTextBot.Api/fillinthetextbot-vyyaxp-c062f43624f6.json
Expand Down
20 changes: 20 additions & 0 deletions FillInTheTextBot.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<Solution>
<Folder Name="/Messengers/">
<Project Path="src\FillInTheTextBot.Messengers.Marusia\FillInTheTextBot.Messengers.Marusia.csproj" />
<Project Path="src\FillInTheTextBot.Messengers.Sber\FillInTheTextBot.Messengers.Sber.csproj" />
<Project Path="src\FillInTheTextBot.Messengers.Yandex\FillInTheTextBot.Messengers.Yandex.csproj" />
<Project Path="src\FillInTheTextBot.Messengers\FillInTheTextBot.Messengers.csproj" />
</Folder>
<Folder Name="/Tests/">
<Project Path="src/FillInTheTextBot.Api.IntegrationTests/FillInTheTextBot.Api.IntegrationTests.csproj" />
<Project Path="src\Dialogflow.Emulator.IntegrationTests\Dialogflow.Emulator.IntegrationTests.csproj" />
<Project Path="src\FillInTheTextBot.Messengers.Tests\FillInTheTextBot.Messengers.Tests.csproj" />
<Project Path="src\FillInTheTextBot.Messengers.Yandex.Tests\FillInTheTextBot.Messengers.Yandex.Tests.csproj" />
<Project Path="src\FillInTheTextBot.Services.Tests\FillInTheTextBot.Services.Tests.csproj" />
</Folder>
<Project Path="src\Dialogflow.Emulator.Client\Dialogflow.Emulator.Client.csproj" Type="C#" />
<Project Path="src\Dialogflow.Emulator\Dialogflow.Emulator.csproj" Type="C#" />
<Project Path="src\FillInTheTextBot.Api\FillInTheTextBot.Api.csproj" />
<Project Path="src\FillInTheTextBot.Models\FillInTheTextBot.Models.csproj" />
<Project Path="src\FillInTheTextBot.Services\FillInTheTextBot.Services.csproj" />
</Solution>
79 changes: 79 additions & 0 deletions MEMORY_LEAK_FIXES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Исправления утечек памяти в FillInTheTextBot

## Обнаруженные и исправленные проблемы:

### 1. **Tracing.cs - Утечка ActivitySource**
**Проблема**: Статический `ActivitySource` создавался, но никогда не освобождался.
**Исправление**: Добавили обработчики событий `AppDomain.CurrentDomain.ProcessExit` и `AppDomain.CurrentDomain.DomainUnload` для вызова `Dispose()`.

### 2. **MetricsCollector.cs - Утечка Meter**
**Проблема**: Статический `Meter` создавался, но никогда не освобождался.
**Исправление**: Сохраняем ссылку на `Meter` и добавили обработчики событий завершения приложения для его освобождения.

### 3. **ExternalServicesRegistration.cs - Утечка ConnectionMultiplexer**
**Проблема**: `ConnectionMultiplexer` создавался каждый раз при вызове `RegisterRedisClient`, что могло приводить к множественным подключениям к Redis.
**Исправление**: Изменили архитектуру - теперь `ConnectionMultiplexer` регистрируется как Singleton отдельно, а `IDatabase` получается из него.

### 4. **gRPC клиенты - Потенциальные утечки и неэффективность**
**Проблема**: `SessionsClient` и `ContextsClient` могли создаваться повторно для каждого запроса, не переиспользовались.
**Исправление**: Создали `GrpcClientManager` который:
- Кэширует клиенты по ScopeId
- Реализует IDisposable для правильного освобождения ресурсов
- Пытается вызвать Dispose/DisposeAsync на клиентах при завершении

### 5. **TasksExtensions.cs - Проблемы с Task.Factory.StartNew**
**Проблема**: Использование `Task.Factory.StartNew` вместо `Task.Run` может приводить к проблемам с управлением памятью.
**Исправление**: Заменили на `Task.Run` который лучше управляет thread pool и ресурсами.

### 6. **Startup.cs - ActivityListener не освобождался**
**Проблема**: `ActivityListener` создавался, но не освобождался при завершении приложения.
**Исправление**: Добавили освобождение в `ApplicationStopping` event.

## Добавленные инструменты диагностики:

### 1. **MemoryDiagnostics.cs**
- Класс для мониторинга использования памяти
- Логирование текущего использования памяти
- Принудительная сборка мусора с логированием
- Периодический мониторинг памяти

### 2. **MemoryMonitoringMiddleware.cs**
- Middleware для отслеживания памяти на каждый HTTP запрос
- Логирует использование памяти до и после обработки запроса

### 3. **GrpcClientManager.cs**
- Менеджер для управления жизненным циклом gRPC клиентов
- Кэширование клиентов
- Правильное освобождение ресурсов

## Интеграция в приложение:

1. **Инициализация диагностики** в `Startup.cs`:
- Инициализация `MemoryDiagnostics`
- Периодический мониторинг памяти (каждые 5 минут)

2. **Middleware pipeline**:
- Добавлен `MemoryMonitoringMiddleware` после `ExceptionsMiddleware`

3. **DI контейнер**:
- `GrpcClientManager` зарегистрирован как Singleton
- `ConnectionMultiplexer` правильно зарегистрирован

## Рекомендации по мониторингу:

1. **Логи памяти**: Следите за логами с префиксом "Memory usage" и "Memory diagnostics"

2. **Метрики**: Используйте существующую Prometheus интеграцию для мониторинга:
- Количество сборок мусора (Gen0, Gen1, Gen2)
- Использование памяти приложением

3. **Периодическая диагностика**: Логи будут показывать использование памяти каждые 5 минут

4. **При высокой нагрузке**: Активируйте логирование памяти для каждого запроса (уже включено)

## Потенциальные дополнительные улучшения:

1. **WeakReference** для кэшей, которые могут расти
2. **IMemoryCache** с TTL для временных данных
3. **Профилирование** с помощью dotMemory или PerfView
4. **Monitoring**: Настроить алерты в Prometheus/Grafana для роста памяти
9 changes: 0 additions & 9 deletions appveyor.yml

This file was deleted.

33 changes: 33 additions & 0 deletions docker-compose.ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
services:
dialogflow-emulator:
build:
context: .
dockerfile: src/Dialogflow.Emulator/Dockerfile
volumes:
- ./Dialogflow/FillInTheTextBot-test-eu:/app/agent:ro
environment:
- AGENT_PATH=/app/agent
- Kestrel__Endpoints__Grpc__Url=http://0.0.0.0:8195
read_only: true
security_opt:
- no-new-privileges:true

redis:
image: redis:alpine
container_name: fillinthetextbot-redis
ports:
- "6379"

FillInTheTextBot:
image: granstel/fillinthetextbot:latest
environment:
- ASPNETCORE_URLS=http://+:8080
- ASPNETCORE_ENVIRONMENT=CI
read_only: true
security_opt:
- no-new-privileges:true
depends_on:
dialogflow-emulator:
condition: service_started
redis:
condition: service_started
21 changes: 21 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
services:
dialogflow-emulator:
build:
context: .
dockerfile: src/Dialogflow.Emulator/Dockerfile
ports:
- "7195:7195"
volumes:
- ./Dialogflow/FillInTheTextBot-test-eu:/app/agent:ro
environment:
- AGENT_PATH=/app/agent
- Kestrel__Endpoints__Grpc__Url=http://0.0.0.0:7195
read_only: true
security_opt:
- no-new-privileges:true

redis:
image: redis:alpine
container_name: fillinthetextbot-redis
ports:
- "6379:6379"
Loading
Loading