diff --git a/shard.lock b/shard.lock index 0fb6a9dc..cbc17e82 100644 --- a/shard.lock +++ b/shard.lock @@ -225,6 +225,10 @@ shards: git: https://github.com/jemc/crystal-pegmatite.git version: 0.2.3+git.commit.f1b6d99b71774f82b6bd17b825d6d7fdd5de38f9 + perf_tools: + git: https://github.com/crystal-lang/perf-tools.git + version: 0.1.0+git.commit.25de6ca509c92d6859d8143cee7e8eea3c2c174b + pg: git: https://github.com/will/crystal-pg.git version: 0.28.0 @@ -267,7 +271,7 @@ shards: placeos-models: git: https://github.com/placeos/models.git - version: 9.38.2 + version: 9.39.0 placeos-resource: git: https://github.com/place-labs/resource.git diff --git a/shard.yml b/shard.yml index e68770b9..0f4e8f6b 100644 --- a/shard.yml +++ b/shard.yml @@ -102,6 +102,9 @@ dependencies: openai: github: spider-gazelle/crystal-openai + perf_tools: + github: crystal-lang/perf-tools + development_dependencies: # Linter ameba: diff --git a/src/app.cr b/src/app.cr index cad31bc5..ce355502 100644 --- a/src/app.cr +++ b/src/app.cr @@ -1,5 +1,7 @@ require "option_parser" require "http/client" +require "perf_tools/mem_prof" +require "perf_tools/fiber_trace" # Server defaults port = 3000 @@ -105,6 +107,11 @@ Signal::TERM.trap &terminate server.run do PlaceOS::Api::Log.info { "listening on #{server.print_addresses}" } STDOUT.flush + + PerfTools::MemProf.log_object_counts(STDOUT) + PerfTools::MemProf.log_object_sizes(STDOUT) + PerfTools::MemProf.pretty_log_allocations(STDOUT) + PerfTools::FiberTrace.pretty_log_fibers(STDOUT) end # Shutdown message diff --git a/src/placeos-rest-api/controllers/root.cr b/src/placeos-rest-api/controllers/root.cr index 41157dcf..3b737a47 100644 --- a/src/placeos-rest-api/controllers/root.cr +++ b/src/placeos-rest-api/controllers/root.cr @@ -9,6 +9,9 @@ require "placeos-models/version" require "path" require "uri" +require "perf_tools/mem_prof" +require "perf_tools/fiber_trace" + module PlaceOS::Api class Root < Application base "/api/engine/v2/" @@ -234,5 +237,15 @@ module PlaceOS::Api success = SearchIngest::Client.client &.backfill raise "backfill failed" unless success end + + @[AC::Route::GET("/dump_memory_trace")] + def dump_memory_trace + resp = response + PerfTools::MemProf.log_object_counts(resp) + PerfTools::MemProf.log_object_sizes(resp) + PerfTools::MemProf.pretty_log_allocations(resp) + PerfTools::FiberTrace.pretty_log_fibers(resp) + @__render_called__ = true + end end end