comparison OrthancServer/OrthancRestApi/OrthancRestSystem.cpp @ 3174:8ea7c4546c3a

primitives to collect metrics in Orthanc
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 29 Jan 2019 15:15:48 +0100
parents ac72032d69a2
children 053e72ff9fc5
comparison
equal deleted inserted replaced
3173:096f4a29f223 3174:8ea7c4546c3a
33 33
34 #include "../PrecompiledHeadersServer.h" 34 #include "../PrecompiledHeadersServer.h"
35 #include "OrthancRestApi.h" 35 #include "OrthancRestApi.h"
36 36
37 #include "../../Core/DicomParsing/FromDcmtkBridge.h" 37 #include "../../Core/DicomParsing/FromDcmtkBridge.h"
38 #include "../../Core/MetricsRegistry.h"
38 #include "../../Plugins/Engine/OrthancPlugins.h" 39 #include "../../Plugins/Engine/OrthancPlugins.h"
39 #include "../../Plugins/Engine/PluginsManager.h" 40 #include "../../Plugins/Engine/PluginsManager.h"
40 #include "../OrthancConfiguration.h" 41 #include "../OrthancConfiguration.h"
41 #include "../ServerContext.h" 42 #include "../ServerContext.h"
42 43
91 call.GetOutput().AnswerJson(result); 92 call.GetOutput().AnswerJson(result);
92 } 93 }
93 94
94 static void GetStatistics(RestApiGetCall& call) 95 static void GetStatistics(RestApiGetCall& call)
95 { 96 {
97 static const uint64_t MEGA_BYTES = 1024 * 1024;
98
99 uint64_t diskSize, uncompressedSize, countPatients, countStudies, countSeries, countInstances;
100 OrthancRestApi::GetIndex(call).GetGlobalStatistics(diskSize, uncompressedSize, countPatients,
101 countStudies, countSeries, countInstances);
102
96 Json::Value result = Json::objectValue; 103 Json::Value result = Json::objectValue;
97 OrthancRestApi::GetIndex(call).ComputeStatistics(result); 104 result["TotalDiskSize"] = boost::lexical_cast<std::string>(diskSize);
105 result["TotalUncompressedSize"] = boost::lexical_cast<std::string>(uncompressedSize);
106 result["TotalDiskSizeMB"] = static_cast<unsigned int>(diskSize / MEGA_BYTES);
107 result["TotalUncompressedSizeMB"] = static_cast<unsigned int>(uncompressedSize / MEGA_BYTES);
108 result["CountPatients"] = static_cast<unsigned int>(countPatients);
109 result["CountStudies"] = static_cast<unsigned int>(countStudies);
110 result["CountSeries"] = static_cast<unsigned int>(countSeries);
111 result["CountInstances"] = static_cast<unsigned int>(countInstances);
112
98 call.GetOutput().AnswerJson(result); 113 call.GetOutput().AnswerJson(result);
99 } 114 }
100 115
101 static void GenerateUid(RestApiGetCall& call) 116 static void GenerateUid(RestApiGetCall& call)
102 { 117 {
388 call.GetOutput().AnswerBuffer("{}", MimeType_Json); 403 call.GetOutput().AnswerBuffer("{}", MimeType_Json);
389 } 404 }
390 } 405 }
391 406
392 407
408 static void GetMetricsPrometheus(RestApiGetCall& call)
409 {
410 static const uint64_t MEGA_BYTES = 1024 * 1024;
411
412 ServerContext& context = OrthancRestApi::GetContext(call);
413
414 MetricsRegistry& registry = context.GetMetricsRegistry();
415
416 uint64_t diskSize, uncompressedSize, countPatients, countStudies, countSeries, countInstances;
417 context.GetIndex().GetGlobalStatistics(diskSize, uncompressedSize, countPatients,
418 countStudies, countSeries, countInstances);
419
420 registry.SetValue("orthanc_disk_size_mb", static_cast<unsigned int>(diskSize / MEGA_BYTES));
421 registry.SetValue("orthanc_uncompressed_size_mb", static_cast<unsigned int>(diskSize / MEGA_BYTES));
422 registry.SetValue("orthanc_count_patients", static_cast<unsigned int>(countPatients));
423 registry.SetValue("orthanc_count_studies", static_cast<unsigned int>(countStudies));
424 registry.SetValue("orthanc_count_series", static_cast<unsigned int>(countSeries));
425 registry.SetValue("orthanc_count_instances", static_cast<unsigned int>(countInstances));
426
427 std::string s;
428 registry.ExportPrometheusText(s);
429
430 call.GetOutput().AnswerBuffer(s, MimeType_PrometheusText);
431 }
432
433
434 static void GetMetricsEnabled(RestApiGetCall& call)
435 {
436 bool enabled = OrthancRestApi::GetContext(call).GetMetricsRegistry().IsEnabled();
437 call.GetOutput().AnswerBuffer(enabled ? "1" : "0", MimeType_PlainText);
438 }
439
440
441 static void PutMetricsEnabled(RestApiPutCall& call)
442 {
443 bool enabled;
444
445 std::string body(call.GetBodyData());
446
447 if (body == "1")
448 {
449 enabled = true;
450 }
451 else if (body == "0")
452 {
453 enabled = false;
454 }
455 else
456 {
457 throw OrthancException(ErrorCode_ParameterOutOfRange,
458 "The HTTP body must be 0 or 1, but found: " + body);
459 }
460
461 // Success
462 OrthancRestApi::GetContext(call).GetMetricsRegistry().SetEnabled(enabled);
463 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
464 }
465
466
393 void OrthancRestApi::RegisterSystem() 467 void OrthancRestApi::RegisterSystem()
394 { 468 {
395 Register("/", ServeRoot); 469 Register("/", ServeRoot);
396 Register("/system", GetSystemInformation); 470 Register("/system", GetSystemInformation);
397 Register("/statistics", GetStatistics); 471 Register("/statistics", GetStatistics);
400 Register("/tools/now", GetNowIsoString<true>); 474 Register("/tools/now", GetNowIsoString<true>);
401 Register("/tools/now-local", GetNowIsoString<false>); 475 Register("/tools/now-local", GetNowIsoString<false>);
402 Register("/tools/dicom-conformance", GetDicomConformanceStatement); 476 Register("/tools/dicom-conformance", GetDicomConformanceStatement);
403 Register("/tools/default-encoding", GetDefaultEncoding); 477 Register("/tools/default-encoding", GetDefaultEncoding);
404 Register("/tools/default-encoding", SetDefaultEncoding); 478 Register("/tools/default-encoding", SetDefaultEncoding);
479 Register("/tools/metrics", GetMetricsEnabled);
480 Register("/tools/metrics", PutMetricsEnabled);
481 Register("/tools/metrics-prometheus", GetMetricsPrometheus);
405 482
406 Register("/plugins", ListPlugins); 483 Register("/plugins", ListPlugins);
407 Register("/plugins/{id}", GetPlugin); 484 Register("/plugins/{id}", GetPlugin);
408 Register("/plugins/explorer.js", GetOrthancExplorerPlugins); 485 Register("/plugins/explorer.js", GetOrthancExplorerPlugins);
409 486