comparison OrthancServer/ServerIndex.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 2e1711f80f74
children 4bbadcd03966
comparison
equal deleted inserted replaced
3173:096f4a29f223 3174:8ea7c4546c3a
970 970
971 return StoreStatus_Failure; 971 return StoreStatus_Failure;
972 } 972 }
973 973
974 974
975 void ServerIndex::ComputeStatistics(Json::Value& target) 975 void ServerIndex::GetGlobalStatistics(/* out */ uint64_t& diskSize,
976 { 976 /* out */ uint64_t& uncompressedSize,
977 boost::mutex::scoped_lock lock(mutex_); 977 /* out */ uint64_t& countPatients,
978 target = Json::objectValue; 978 /* out */ uint64_t& countStudies,
979 979 /* out */ uint64_t& countSeries,
980 uint64_t cs = db_.GetTotalCompressedSize(); 980 /* out */ uint64_t& countInstances)
981 uint64_t us = db_.GetTotalUncompressedSize(); 981 {
982 target["TotalDiskSize"] = boost::lexical_cast<std::string>(cs); 982 boost::mutex::scoped_lock lock(mutex_);
983 target["TotalUncompressedSize"] = boost::lexical_cast<std::string>(us); 983 diskSize = db_.GetTotalCompressedSize();
984 target["TotalDiskSizeMB"] = static_cast<unsigned int>(cs / MEGA_BYTES); 984 uncompressedSize = db_.GetTotalUncompressedSize();
985 target["TotalUncompressedSizeMB"] = static_cast<unsigned int>(us / MEGA_BYTES); 985 countPatients = db_.GetResourceCount(ResourceType_Patient);
986 986 countStudies = db_.GetResourceCount(ResourceType_Study);
987 target["CountPatients"] = static_cast<unsigned int>(db_.GetResourceCount(ResourceType_Patient)); 987 countSeries = db_.GetResourceCount(ResourceType_Series);
988 target["CountStudies"] = static_cast<unsigned int>(db_.GetResourceCount(ResourceType_Study)); 988 countInstances = db_.GetResourceCount(ResourceType_Instance);
989 target["CountSeries"] = static_cast<unsigned int>(db_.GetResourceCount(ResourceType_Series)); 989 }
990 target["CountInstances"] = static_cast<unsigned int>(db_.GetResourceCount(ResourceType_Instance));
991 }
992
993 990
994 991
995 SeriesStatus ServerIndex::GetSeriesStatus(int64_t id, 992 SeriesStatus ServerIndex::GetSeriesStatus(int64_t id,
996 int64_t expectedNumberOfInstances) 993 int64_t expectedNumberOfInstances)
997 { 994 {
1929 boost::mutex::scoped_lock lock(mutex_); 1926 boost::mutex::scoped_lock lock(mutex_);
1930 db_.ClearExportedResources(); 1927 db_.ClearExportedResources();
1931 } 1928 }
1932 1929
1933 1930
1934 void ServerIndex::GetStatisticsInternal(/* out */ uint64_t& diskSize, 1931 void ServerIndex::GetResourceStatistics(/* out */ ResourceType& type,
1932 /* out */ uint64_t& diskSize,
1935 /* out */ uint64_t& uncompressedSize, 1933 /* out */ uint64_t& uncompressedSize,
1936 /* out */ unsigned int& countStudies, 1934 /* out */ unsigned int& countStudies,
1937 /* out */ unsigned int& countSeries, 1935 /* out */ unsigned int& countSeries,
1938 /* out */ unsigned int& countInstances, 1936 /* out */ unsigned int& countInstances,
1939 /* out */ uint64_t& dicomDiskSize, 1937 /* out */ uint64_t& dicomDiskSize,
1940 /* out */ uint64_t& dicomUncompressedSize, 1938 /* out */ uint64_t& dicomUncompressedSize,
1941 /* in */ int64_t id, 1939 const std::string& publicId)
1942 /* in */ ResourceType type) 1940 {
1943 { 1941 boost::mutex::scoped_lock lock(mutex_);
1942
1943 int64_t top;
1944 if (!db_.LookupResource(top, type, publicId))
1945 {
1946 throw OrthancException(ErrorCode_UnknownResource);
1947 }
1948
1944 std::stack<int64_t> toExplore; 1949 std::stack<int64_t> toExplore;
1945 toExplore.push(id); 1950 toExplore.push(top);
1946 1951
1947 countInstances = 0; 1952 countInstances = 0;
1948 countSeries = 0; 1953 countSeries = 0;
1949 countStudies = 0; 1954 countStudies = 0;
1950 diskSize = 0; 1955 diskSize = 0;
2018 2023
2019 if (countSeries == 0) 2024 if (countSeries == 0)
2020 { 2025 {
2021 countSeries = 1; 2026 countSeries = 1;
2022 } 2027 }
2023 }
2024
2025
2026
2027 void ServerIndex::GetStatistics(Json::Value& target,
2028 const std::string& publicId)
2029 {
2030 boost::mutex::scoped_lock lock(mutex_);
2031
2032 ResourceType type;
2033 int64_t top;
2034 if (!db_.LookupResource(top, type, publicId))
2035 {
2036 throw OrthancException(ErrorCode_UnknownResource);
2037 }
2038
2039 uint64_t uncompressedSize;
2040 uint64_t diskSize;
2041 uint64_t dicomUncompressedSize;
2042 uint64_t dicomDiskSize;
2043 unsigned int countStudies;
2044 unsigned int countSeries;
2045 unsigned int countInstances;
2046 GetStatisticsInternal(diskSize, uncompressedSize, countStudies,
2047 countSeries, countInstances, dicomDiskSize, dicomUncompressedSize, top, type);
2048
2049 target = Json::objectValue;
2050 target["DiskSize"] = boost::lexical_cast<std::string>(diskSize);
2051 target["DiskSizeMB"] = static_cast<unsigned int>(diskSize / MEGA_BYTES);
2052 target["UncompressedSize"] = boost::lexical_cast<std::string>(uncompressedSize);
2053 target["UncompressedSizeMB"] = static_cast<unsigned int>(uncompressedSize / MEGA_BYTES);
2054
2055 target["DicomDiskSize"] = boost::lexical_cast<std::string>(dicomDiskSize);
2056 target["DicomDiskSizeMB"] = static_cast<unsigned int>(dicomDiskSize / MEGA_BYTES);
2057 target["DicomUncompressedSize"] = boost::lexical_cast<std::string>(dicomUncompressedSize);
2058 target["DicomUncompressedSizeMB"] = static_cast<unsigned int>(dicomUncompressedSize / MEGA_BYTES);
2059
2060 switch (type)
2061 {
2062 // Do NOT add "break" below this point!
2063 case ResourceType_Patient:
2064 target["CountStudies"] = countStudies;
2065
2066 case ResourceType_Study:
2067 target["CountSeries"] = countSeries;
2068
2069 case ResourceType_Series:
2070 target["CountInstances"] = countInstances;
2071
2072 case ResourceType_Instance:
2073 default:
2074 break;
2075 }
2076 }
2077
2078
2079 void ServerIndex::GetStatistics(/* out */ uint64_t& diskSize,
2080 /* out */ uint64_t& uncompressedSize,
2081 /* out */ unsigned int& countStudies,
2082 /* out */ unsigned int& countSeries,
2083 /* out */ unsigned int& countInstances,
2084 /* out */ uint64_t& dicomDiskSize,
2085 /* out */ uint64_t& dicomUncompressedSize,
2086 const std::string& publicId)
2087 {
2088 boost::mutex::scoped_lock lock(mutex_);
2089
2090 ResourceType type;
2091 int64_t top;
2092 if (!db_.LookupResource(top, type, publicId))
2093 {
2094 throw OrthancException(ErrorCode_UnknownResource);
2095 }
2096
2097 GetStatisticsInternal(diskSize, uncompressedSize, countStudies,
2098 countSeries, countInstances, dicomDiskSize,
2099 dicomUncompressedSize, top, type);
2100 } 2028 }
2101 2029
2102 2030
2103 void ServerIndex::UnstableResourcesMonitorThread(ServerIndex* that, 2031 void ServerIndex::UnstableResourcesMonitorThread(ServerIndex* that,
2104 unsigned int threadSleep) 2032 unsigned int threadSleep)