comparison Plugins/Engine/OrthancPlugins.cpp @ 3179:fca730c267d7

New primitives to set and refresh metrics
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 30 Jan 2019 17:12:15 +0100
parents a323b75e5b08
children 6c86d4d407da
comparison
equal deleted inserted replaced
3178:6d558598d713 3179:fca730c267d7
42 # error The macro DCMTK_VERSION_NUMBER must be defined 42 # error The macro DCMTK_VERSION_NUMBER must be defined
43 #endif 43 #endif
44 44
45 45
46 #include "../../Core/ChunkedBuffer.h" 46 #include "../../Core/ChunkedBuffer.h"
47 #include "../../Core/Compression/GzipCompressor.h"
48 #include "../../Core/Compression/ZlibCompressor.h"
47 #include "../../Core/DicomFormat/DicomArray.h" 49 #include "../../Core/DicomFormat/DicomArray.h"
50 #include "../../Core/DicomParsing/FromDcmtkBridge.h"
51 #include "../../Core/DicomParsing/Internals/DicomImageDecoder.h"
52 #include "../../Core/DicomParsing/ToDcmtkBridge.h"
48 #include "../../Core/HttpServer/HttpToolbox.h" 53 #include "../../Core/HttpServer/HttpToolbox.h"
54 #include "../../Core/Images/Image.h"
55 #include "../../Core/Images/ImageProcessing.h"
56 #include "../../Core/Images/JpegReader.h"
57 #include "../../Core/Images/JpegWriter.h"
58 #include "../../Core/Images/PngReader.h"
59 #include "../../Core/Images/PngWriter.h"
49 #include "../../Core/Logging.h" 60 #include "../../Core/Logging.h"
61 #include "../../Core/MetricsRegistry.h"
50 #include "../../Core/OrthancException.h" 62 #include "../../Core/OrthancException.h"
51 #include "../../Core/SerializationToolbox.h" 63 #include "../../Core/SerializationToolbox.h"
52 #include "../../Core/Toolbox.h" 64 #include "../../Core/Toolbox.h"
53 #include "../../Core/DicomParsing/FromDcmtkBridge.h" 65 #include "../../OrthancServer/DefaultDicomImageDecoder.h"
54 #include "../../Core/DicomParsing/ToDcmtkBridge.h"
55 #include "../../OrthancServer/OrthancConfiguration.h" 66 #include "../../OrthancServer/OrthancConfiguration.h"
67 #include "../../OrthancServer/OrthancFindRequestHandler.h"
68 #include "../../OrthancServer/Search/HierarchicalMatcher.h"
56 #include "../../OrthancServer/ServerContext.h" 69 #include "../../OrthancServer/ServerContext.h"
57 #include "../../OrthancServer/ServerToolbox.h" 70 #include "../../OrthancServer/ServerToolbox.h"
58 #include "../../OrthancServer/Search/HierarchicalMatcher.h"
59 #include "../../Core/DicomParsing/Internals/DicomImageDecoder.h"
60 #include "../../Core/Compression/ZlibCompressor.h"
61 #include "../../Core/Compression/GzipCompressor.h"
62 #include "../../Core/Images/Image.h"
63 #include "../../Core/Images/PngReader.h"
64 #include "../../Core/Images/PngWriter.h"
65 #include "../../Core/Images/JpegReader.h"
66 #include "../../Core/Images/JpegWriter.h"
67 #include "../../Core/Images/ImageProcessing.h"
68 #include "../../OrthancServer/DefaultDicomImageDecoder.h"
69 #include "../../OrthancServer/OrthancFindRequestHandler.h"
70 #include "PluginsEnumerations.h" 71 #include "PluginsEnumerations.h"
71 #include "PluginsJob.h" 72 #include "PluginsJob.h"
72 73
73 #include <boost/regex.hpp> 74 #include <boost/regex.hpp>
74 #include <dcmtk/dcmdata/dcdict.h> 75 #include <dcmtk/dcmdata/dcdict.h>
460 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; 461 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks;
461 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; 462 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters;
462 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2; 463 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2;
463 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; 464 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks;
464 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers; 465 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers;
466 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks;
465 typedef std::map<Property, std::string> Properties; 467 typedef std::map<Property, std::string> Properties;
466 468
467 PluginsManager manager_; 469 PluginsManager manager_;
468 470
469 RestCallbacks restCallbacks_; 471 RestCallbacks restCallbacks_;
474 DecodeImageCallbacks decodeImageCallbacks_; 476 DecodeImageCallbacks decodeImageCallbacks_;
475 JobsUnserializers jobsUnserializers_; 477 JobsUnserializers jobsUnserializers_;
476 _OrthancPluginMoveCallback moveCallbacks_; 478 _OrthancPluginMoveCallback moveCallbacks_;
477 IncomingHttpRequestFilters incomingHttpRequestFilters_; 479 IncomingHttpRequestFilters incomingHttpRequestFilters_;
478 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_; 480 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_;
481 RefreshMetricsCallbacks refreshMetricsCallbacks_;
479 std::auto_ptr<StorageAreaFactory> storageArea_; 482 std::auto_ptr<StorageAreaFactory> storageArea_;
480 483
481 boost::recursive_mutex restCallbackMutex_; 484 boost::recursive_mutex restCallbackMutex_;
482 boost::recursive_mutex storedCallbackMutex_; 485 boost::recursive_mutex storedCallbackMutex_;
483 boost::recursive_mutex changeCallbackMutex_; 486 boost::recursive_mutex changeCallbackMutex_;
484 boost::mutex findCallbackMutex_; 487 boost::mutex findCallbackMutex_;
485 boost::mutex worklistCallbackMutex_; 488 boost::mutex worklistCallbackMutex_;
486 boost::mutex decodeImageCallbackMutex_; 489 boost::mutex decodeImageCallbackMutex_;
487 boost::mutex jobsUnserializersMutex_; 490 boost::mutex jobsUnserializersMutex_;
491 boost::mutex refreshMetricsMutex_;
488 boost::recursive_mutex invokeServiceMutex_; 492 boost::recursive_mutex invokeServiceMutex_;
489 493
490 Properties properties_; 494 Properties properties_;
491 int argc_; 495 int argc_;
492 char** argv_; 496 char** argv_;
1308 LOG(INFO) << "Plugin has registered a callback to filter incoming HTTP requests"; 1312 LOG(INFO) << "Plugin has registered a callback to filter incoming HTTP requests";
1309 pimpl_->incomingHttpRequestFilters2_.push_back(p.callback); 1313 pimpl_->incomingHttpRequestFilters2_.push_back(p.callback);
1310 } 1314 }
1311 1315
1312 1316
1317 void OrthancPlugins::RegisterRefreshMetricsCallback(const void* parameters)
1318 {
1319 const _OrthancPluginRegisterRefreshMetricsCallback& p =
1320 *reinterpret_cast<const _OrthancPluginRegisterRefreshMetricsCallback*>(parameters);
1321
1322 boost::mutex::scoped_lock lock(pimpl_->refreshMetricsMutex_);
1323
1324 LOG(INFO) << "Plugin has registered a callback to refresh its metrics";
1325 pimpl_->refreshMetricsCallbacks_.push_back(p.callback);
1326 }
1327
1328
1313 void OrthancPlugins::AnswerBuffer(const void* parameters) 1329 void OrthancPlugins::AnswerBuffer(const void* parameters)
1314 { 1330 {
1315 const _OrthancPluginAnswerBuffer& p = 1331 const _OrthancPluginAnswerBuffer& p =
1316 *reinterpret_cast<const _OrthancPluginAnswerBuffer*>(parameters); 1332 *reinterpret_cast<const _OrthancPluginAnswerBuffer*>(parameters);
1317 1333
3094 *reinterpret_cast<const _OrthancPluginRetrieveStaticString*>(parameters); 3110 *reinterpret_cast<const _OrthancPluginRetrieveStaticString*>(parameters);
3095 *p.result = EnumerationToString(SystemToolbox::AutodetectMimeType(p.argument)); 3111 *p.result = EnumerationToString(SystemToolbox::AutodetectMimeType(p.argument));
3096 return true; 3112 return true;
3097 } 3113 }
3098 3114
3115 case _OrthancPluginService_SetMetricsValue:
3116 {
3117 const _OrthancPluginSetMetricsValue& p =
3118 *reinterpret_cast<const _OrthancPluginSetMetricsValue*>(parameters);
3119
3120 MetricsType type;
3121 switch (p.type)
3122 {
3123 case OrthancPluginMetricsType_Default:
3124 type = MetricsType_Default;
3125 break;
3126
3127 case OrthancPluginMetricsType_Timer:
3128 type = MetricsType_MaxOver10Seconds;
3129 break;
3130
3131 default:
3132 throw OrthancException(ErrorCode_ParameterOutOfRange);
3133 }
3134
3135 {
3136 PImpl::ServerContextLock lock(*pimpl_);
3137 lock.GetContext().GetMetricsRegistry().SetValue(p.name, p.value, type);
3138 }
3139
3140 return true;
3141 }
3142
3099 default: 3143 default:
3100 return false; 3144 return false;
3101 } 3145 }
3102 } 3146 }
3103 3147
3153 RegisterIncomingHttpRequestFilter(parameters); 3197 RegisterIncomingHttpRequestFilter(parameters);
3154 return true; 3198 return true;
3155 3199
3156 case _OrthancPluginService_RegisterIncomingHttpRequestFilter2: 3200 case _OrthancPluginService_RegisterIncomingHttpRequestFilter2:
3157 RegisterIncomingHttpRequestFilter2(parameters); 3201 RegisterIncomingHttpRequestFilter2(parameters);
3202 return true;
3203
3204 case _OrthancPluginService_RegisterRefreshMetricsCallback:
3205 RegisterRefreshMetricsCallback(parameters);
3158 return true; 3206 return true;
3159 3207
3160 case _OrthancPluginService_RegisterStorageArea: 3208 case _OrthancPluginService_RegisterStorageArea:
3161 { 3209 {
3162 LOG(INFO) << "Plugin has registered a custom storage area"; 3210 LOG(INFO) << "Plugin has registered a custom storage area";
3657 } 3705 }
3658 } 3706 }
3659 3707
3660 return NULL; 3708 return NULL;
3661 } 3709 }
3710
3711
3712 void OrthancPlugins::RefreshMetrics()
3713 {
3714 boost::mutex::scoped_lock lock(pimpl_->refreshMetricsMutex_);
3715
3716 for (PImpl::RefreshMetricsCallbacks::iterator
3717 it = pimpl_->refreshMetricsCallbacks_.begin();
3718 it != pimpl_->refreshMetricsCallbacks_.end(); ++it)
3719 {
3720 if (*it != NULL)
3721 {
3722 (*it) ();
3723 }
3724 }
3725 }
3662 } 3726 }