diff options
| author | Dan Engelbrecht <[email protected]> | 2023-09-14 13:41:06 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-09-14 19:41:06 +0200 |
| commit | b57cb102bdbba3ef3fbcb3d9c66b78e7ca406891 (patch) | |
| tree | 812c13d3a2ff6c1c617fddb401845a744f13fcd5 /src | |
| parent | enable sentry personal information (ip/username) on shared instances (#404) (diff) | |
| download | zen-b57cb102bdbba3ef3fbcb3d9c66b78e7ca406891.tar.xz zen-b57cb102bdbba3ef3fbcb3d9c66b78e7ca406891.zip | |
More statistics for Cache, Project Store and Cid Store (#405)
Cache: requestcount, badrequestcount, writes
Project Store: requestcount
Cid Store: cidhits, cidmisses, cidwrites
Diffstat (limited to 'src')
| -rw-r--r-- | src/zenserver/cache/httpstructuredcache.cpp | 58 | ||||
| -rw-r--r-- | src/zenserver/cache/httpstructuredcache.h | 3 | ||||
| -rw-r--r-- | src/zenserver/projectstore/httpprojectstore.cpp | 3 | ||||
| -rw-r--r-- | src/zenserver/projectstore/httpprojectstore.h | 1 | ||||
| -rw-r--r-- | src/zenstore/cidstore.cpp | 31 | ||||
| -rw-r--r-- | src/zenstore/include/zenstore/cidstore.h | 24 |
6 files changed, 105 insertions, 15 deletions
diff --git a/src/zenserver/cache/httpstructuredcache.cpp b/src/zenserver/cache/httpstructuredcache.cpp index ddfd1eeb5..7f1ce18f9 100644 --- a/src/zenserver/cache/httpstructuredcache.cpp +++ b/src/zenserver/cache/httpstructuredcache.cpp @@ -395,6 +395,7 @@ HttpStructuredCacheService::HandleDetailsRequest(HttpServerRequest& Request) FilterNamespace = Tokens[1]; if (FilterNamespace.empty()) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); // invalid URL } } @@ -404,11 +405,13 @@ HttpStructuredCacheService::HandleDetailsRequest(HttpServerRequest& Request) FilterNamespace = Tokens[1]; if (FilterNamespace.empty()) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); // invalid URL } FilterBucket = Tokens[2]; if (FilterBucket.empty()) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); // invalid URL } } @@ -418,21 +421,25 @@ HttpStructuredCacheService::HandleDetailsRequest(HttpServerRequest& Request) FilterNamespace = Tokens[1]; if (FilterNamespace.empty()) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); // invalid URL } FilterBucket = Tokens[2]; if (FilterBucket.empty()) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); // invalid URL } FilterValue = Tokens[3]; if (FilterValue.empty()) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); // invalid URL } } break; default: + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); // invalid URL } @@ -596,6 +603,7 @@ HttpStructuredCacheService::HandleDetailsRequest(HttpServerRequest& Request) void HttpStructuredCacheService::HandleRequest(HttpServerRequest& Request) { + m_CacheStats.RequestCount++; metrics::OperationTiming::Scope $(m_HttpRequests); std::string_view Key = Request.RelativeUri(); @@ -648,6 +656,7 @@ HttpStructuredCacheService::HandleRequest(HttpServerRequest& Request) HttpRequestData RequestData; if (!HttpRequestParseRelativeUri(Key, RequestData)) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); // invalid URL } @@ -733,6 +742,9 @@ HttpStructuredCacheService::HandleCacheRequest(HttpServerRequest& Request) return Request.WriteResponse(HttpResponseCode::OK, ResponseWriter.Save()); } break; + default: + m_CacheStats.BadRequestCount++; + break; } } @@ -1035,6 +1047,7 @@ HttpStructuredCacheService::HandleGetCacheRecord(HttpServerRequest& Request, con if (Success && StoreLocal) { m_CacheStore.Put(RequestContext, Ref.Namespace, Ref.BucketSegment, Ref.HashKey, ClientResultValue); + m_CacheStats.WriteCount++; } } else if (AcceptType == ZenContentType::kCbPackage) @@ -1109,6 +1122,7 @@ HttpStructuredCacheService::HandleGetCacheRecord(HttpServerRequest& Request, con if (StoreLocal) { m_CacheStore.Put(RequestContext, Ref.Namespace, Ref.BucketSegment, Ref.HashKey, CacheValue); + m_CacheStats.WriteCount++; } for (const CbAttachment* Attachment : AttachmentsToStoreLocally) @@ -1203,6 +1217,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(HttpServerRequest& Request, con if (!Body || Body.Size() == 0) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); } if (!AreDiskWritesAllowed()) @@ -1228,6 +1243,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(HttpServerRequest& Request, con { if (!CompressedBuffer::ValidateCompressedHeader(Body, RawHash, RawSize)) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Payload is not a valid compressed binary"sv); @@ -1242,6 +1258,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(HttpServerRequest& Request, con Ref.BucketSegment, Ref.HashKey, {.Value = Body, .RawSize = RawSize, .RawHash = RawHash}); + m_CacheStats.WriteCount++; if (HasUpstream && EnumHasAllFlags(PolicyFromUrl, CachePolicy::StoreRemote)) { @@ -1268,11 +1285,13 @@ HttpStructuredCacheService::HandlePutCacheRecord(HttpServerRequest& Request, con Ref.BucketSegment, Ref.HashKey, ToString(ContentType)); + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Compact binary validation failed"sv); } Body.SetContentType(ZenContentType::kCbObject); m_CacheStore.Put(RequestContext, Ref.Namespace, Ref.BucketSegment, Ref.HashKey, {.Value = Body}); + m_CacheStats.WriteCount++; CbObjectView CacheRecord(Body.Data()); std::vector<IoHash> ValidAttachments; @@ -1321,6 +1340,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(HttpServerRequest& Request, con Ref.BucketSegment, Ref.HashKey, ToString(ContentType)); + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Invalid package"sv); } CachePolicy Policy = PolicyFromUrl; @@ -1365,6 +1385,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(HttpServerRequest& Request, con if (Count.Invalid > 0) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Invalid attachment(s)"sv); } @@ -1372,6 +1393,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(HttpServerRequest& Request, con CacheValue.Value = CacheRecord.GetBuffer().AsIoBuffer(); CacheValue.Value.SetContentType(ZenContentType::kCbObject); m_CacheStore.Put(RequestContext, Ref.Namespace, Ref.BucketSegment, Ref.HashKey, CacheValue); + m_CacheStats.WriteCount++; for (const CbAttachment* Attachment : AttachmentsToStoreLocally) { @@ -1408,6 +1430,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(HttpServerRequest& Request, con } else { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Content-Type invalid"sv); } } @@ -1524,6 +1547,7 @@ HttpStructuredCacheService::HandlePutCacheChunk(HttpServerRequest& Request, cons if (!Body || Body.Size() == 0) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); } if (!AreDiskWritesAllowed()) @@ -1537,11 +1561,13 @@ HttpStructuredCacheService::HandlePutCacheChunk(HttpServerRequest& Request, cons uint64_t RawSize; if (!CompressedBuffer::ValidateCompressedHeader(Body, RawHash, RawSize)) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Attachments must be compressed"sv); } if (RawHash != Ref.ValueContentId) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "ValueContentId does not match attachment hash"sv); @@ -1622,6 +1648,7 @@ HttpStructuredCacheService::HandleRpcRequest(const CacheRequestContext& Context, } else { + m_CacheStats.BadRequestCount++; return HttpResponseCode::BadRequest; } return HttpResponseCode::OK; @@ -1704,6 +1731,7 @@ HttpStructuredCacheService::HandleRpcRequest(HttpServerRequest& Request) if ((ContentType != HttpContentType::kCbObject && ContentType != HttpContentType::kCbPackage) || AcceptType != HttpContentType::kCbPackage) { + m_CacheStats.BadRequestCount++; return Request.WriteResponse(HttpResponseCode::BadRequest); } @@ -1770,6 +1798,7 @@ HttpStructuredCacheService::HandleRpcRequest(HttpServerRequest& Request) } break; default: + m_CacheStats.BadRequestCount++; Request.WriteResponse(HttpResponseCode::BadRequest); break; } @@ -1892,6 +1921,7 @@ HttpStructuredCacheService::PutCacheRecord(PutRequestData& Request, const CbPack Record.CopyTo(MutableMemoryView(CacheValue.Value.MutableData(), CacheValue.Value.GetSize())); CacheValue.Value.SetContentType(ZenContentType::kCbObject); m_CacheStore.Put(Request.Context, Request.Namespace, Request.Key.Bucket, Request.Key.Hash, CacheValue); + m_CacheStats.WriteCount++; for (const CbAttachment* Attachment : AttachmentsToStoreLocally) { @@ -2072,6 +2102,7 @@ HttpStructuredCacheService::HandleRpcGetCacheRecords(const CacheRequestContext& ZEN_WARN("Skipping invalid chunk in local cache '{}'", Value.ContentId); } } + if (EnumHasAllFlags(ValuePolicy, CachePolicy::QueryRemote)) { NeedUpstreamAttachment = true; @@ -2152,6 +2183,7 @@ HttpStructuredCacheService::HandleRpcGetCacheRecords(const CacheRequestContext& if (StoreLocal) { m_CacheStore.Put(Context, *Namespace, Key.Bucket, Key.Hash, {.Value = {Request.RecordCacheValue}}); + m_CacheStats.WriteCount++; } ParseValues(Request); Request.Source = Params.Source; @@ -2331,6 +2363,7 @@ HttpStructuredCacheService::HandleRpcPutCacheValues(const CacheRequestContext& C RawSize = Chunk.DecodeRawSize(); } m_CacheStore.Put(Context, *Namespace, Key.Bucket, Key.Hash, {.Value = Value, .RawSize = RawSize, .RawHash = RawHash}); + m_CacheStats.WriteCount++; TransferredSize = Chunk.GetCompressedSize(); } Succeeded = true; @@ -2521,6 +2554,7 @@ HttpStructuredCacheService::HandleRpcGetCacheValues(const CacheRequestContext& C Request.Key.Bucket, Request.Key.Hash, ZenCacheValue{.Value = Params.Value, .RawSize = Request.RawSize, .RawHash = Request.RawHash}); + m_CacheStats.WriteCount++; } ZEN_DEBUG("GETCACHEVALUES HIT - '{}/{}/{}' {} ({}) in {}", @@ -2830,6 +2864,7 @@ HttpStructuredCacheService::GetLocalCacheRecords(const CacheRequestContext& if (StoreLocal) { m_CacheStore.Put(Context, Namespace, Key.Bucket, Key.Hash, {.Value = Record.CacheValue}); + m_CacheStats.WriteCount++; } }; m_UpstreamCache.GetCacheRecords(Namespace, UpstreamRecordRequests, std::move(OnCacheRecordGetComplete)); @@ -3009,6 +3044,7 @@ HttpStructuredCacheService::GetUpstreamCacheChunks(const CacheRequestContext& Key.Key.Bucket, Key.Key.Hash, {.Value = Params.Value, .RawSize = Params.RawSize, .RawHash = Params.RawHash}); + m_CacheStats.WriteCount++; } } if (!EnumHasAllFlags(Request.DownstreamPolicy, CachePolicy::SkipData)) @@ -3103,10 +3139,17 @@ HttpStructuredCacheService::HandleStatsRequest(HttpServerRequest& Request) EmitSnapshot("requests", m_HttpRequests, Cbo); EmitSnapshot("upstream_gets", m_UpstreamGetRequestTiming, Cbo); - const uint64_t HitCount = m_CacheStats.HitCount; - const uint64_t UpstreamHitCount = m_CacheStats.UpstreamHitCount; - const uint64_t MissCount = m_CacheStats.MissCount; - const uint64_t TotalCount = HitCount + MissCount; + const uint64_t HitCount = m_CacheStats.HitCount; + const uint64_t UpstreamHitCount = m_CacheStats.UpstreamHitCount; + const uint64_t MissCount = m_CacheStats.MissCount; + const uint64_t WriteCount = m_CacheStats.WriteCount; + const uint64_t RequestCount = m_CacheStats.RequestCount; + const uint64_t BadRequestCount = m_CacheStats.BadRequestCount; + struct CidStoreStats StoreStats = m_CidStore.Stats(); + const uint64_t ChunkHitCount = StoreStats.HitCount; + const uint64_t ChunkMissCount = StoreStats.MissCount; + const uint64_t ChunkWriteCount = StoreStats.WriteCount; + const uint64_t TotalCount = HitCount + MissCount; const CidStoreSize CidSize = m_CidStore.TotalSize(); const GcStorageSize CacheSize = m_CacheStore.StorageSize(); @@ -3121,10 +3164,15 @@ HttpStructuredCacheService::HandleStatsRequest(HttpServerRequest& Request) Cbo.EndObject(); Cbo << "upstream_ratio" << (HitCount > 0 ? (double(UpstreamHitCount) / double(HitCount)) : 0.0); - Cbo << "hits" << HitCount << "misses" << MissCount; + Cbo << "hits" << HitCount << "misses" << MissCount << "writes" << WriteCount; Cbo << "hit_ratio" << (TotalCount > 0 ? (double(HitCount) / double(TotalCount)) : 0.0); Cbo << "upstream_hits" << m_CacheStats.UpstreamHitCount; Cbo << "upstream_ratio" << (HitCount > 0 ? (double(UpstreamHitCount) / double(HitCount)) : 0.0); + Cbo << "upstream_ratio" << (HitCount > 0 ? (double(UpstreamHitCount) / double(HitCount)) : 0.0); + Cbo << "requestcount" << RequestCount; + Cbo << "badrequestcount" << BadRequestCount; + + Cbo << "cidhits" << ChunkHitCount << "cidmisses" << ChunkMissCount << "cidwrites" << ChunkWriteCount; } Cbo.EndObject(); diff --git a/src/zenserver/cache/httpstructuredcache.h b/src/zenserver/cache/httpstructuredcache.h index 7ad3f5ac8..c64855e70 100644 --- a/src/zenserver/cache/httpstructuredcache.h +++ b/src/zenserver/cache/httpstructuredcache.h @@ -98,6 +98,9 @@ private: std::atomic_uint64_t HitCount{}; std::atomic_uint64_t UpstreamHitCount{}; std::atomic_uint64_t MissCount{}; + std::atomic_uint64_t WriteCount{}; + std::atomic_uint64_t RequestCount{}; + std::atomic_uint64_t BadRequestCount{}; }; enum class PutResult { diff --git a/src/zenserver/projectstore/httpprojectstore.cpp b/src/zenserver/projectstore/httpprojectstore.cpp index ff7a5f8b9..7ab847c73 100644 --- a/src/zenserver/projectstore/httpprojectstore.cpp +++ b/src/zenserver/projectstore/httpprojectstore.cpp @@ -375,8 +375,10 @@ HttpProjectService::BaseUri() const void HttpProjectService::HandleRequest(HttpServerRequest& Request) { + m_ProjectStats.RequestCount++; if (m_Router.HandleRequest(Request) == false) { + m_ProjectStats.BadRequestCount++; ZEN_WARN("No route found for {0}", Request.RelativeUri()); } } @@ -427,6 +429,7 @@ HttpProjectService::HandleStatsRequest(HttpServerRequest& HttpReq) } Cbo.EndObject(); + Cbo << "requestcount" << m_ProjectStats.RequestCount; Cbo << "badrequestcount" << m_ProjectStats.BadRequestCount; } Cbo.EndObject(); diff --git a/src/zenserver/projectstore/httpprojectstore.h b/src/zenserver/projectstore/httpprojectstore.h index 5c558f8d2..739dabe23 100644 --- a/src/zenserver/projectstore/httpprojectstore.h +++ b/src/zenserver/projectstore/httpprojectstore.h @@ -56,6 +56,7 @@ private: std::atomic_uint64_t ChunkHitCount{}; std::atomic_uint64_t ChunkMissCount{}; std::atomic_uint64_t ChunkWriteCount{}; + std::atomic_uint64_t RequestCount{}; std::atomic_uint64_t BadRequestCount{}; }; diff --git a/src/zenstore/cidstore.cpp b/src/zenstore/cidstore.cpp index 734ae8433..e366a6cb4 100644 --- a/src/zenstore/cidstore.cpp +++ b/src/zenstore/cidstore.cpp @@ -35,11 +35,26 @@ struct CidStore::Impl Payload.SetContentType(ZenContentType::kCompressedBinary); CasStore::InsertResult Result = m_CasStore.InsertChunk(Payload, RawHash, static_cast<CasStore::InsertMode>(Mode)); - + if (Result.New) + { + WriteCount++; + } return {.New = Result.New}; } - IoBuffer FindChunkByCid(const IoHash& DecompressedId) { return m_CasStore.FindChunk(DecompressedId); } + IoBuffer FindChunkByCid(const IoHash& DecompressedId) + { + IoBuffer Result = m_CasStore.FindChunk(DecompressedId); + if (Result) + { + HitCount++; + } + else + { + MissCount++; + } + return Result; + } bool ContainsChunk(const IoHash& DecompressedId) { return m_CasStore.ContainsChunk(DecompressedId); } @@ -62,6 +77,12 @@ struct CidStore::Impl m_CasStore.ScrubStorage(Ctx); } + CidStoreStats Stats() { return CidStoreStats{.HitCount = HitCount, .MissCount = MissCount, .WriteCount = WriteCount}; } + + std::atomic_uint64_t HitCount{}; + std::atomic_uint64_t MissCount{}; + std::atomic_uint64_t WriteCount{}; + uint64_t m_LastScrubTime = 0; }; @@ -123,4 +144,10 @@ CidStore::TotalSize() const return m_Impl->m_CasStore.TotalSize(); } +CidStoreStats +CidStore::Stats() const +{ + return m_Impl->Stats(); +} + } // namespace zen diff --git a/src/zenstore/include/zenstore/cidstore.h b/src/zenstore/include/zenstore/cidstore.h index 38815ed15..945f5d25a 100644 --- a/src/zenstore/include/zenstore/cidstore.h +++ b/src/zenstore/include/zenstore/cidstore.h @@ -29,6 +29,13 @@ struct CidStoreSize uint64_t TotalSize = 0; }; +struct CidStoreStats +{ + uint64_t HitCount; + uint64_t MissCount; + uint64_t WriteCount; +}; + struct CidStoreConfiguration { // Root directory for CAS store @@ -65,14 +72,15 @@ public: kMayBeMovedInPlace }; - void Initialize(const CidStoreConfiguration& Config); - InsertResult AddChunk(const IoBuffer& ChunkData, const IoHash& RawHash, InsertMode Mode = InsertMode::kMayBeMovedInPlace); - IoBuffer FindChunkByCid(const IoHash& DecompressedId); - bool ContainsChunk(const IoHash& DecompressedId); - void FilterChunks(HashKeySet& InOutChunks); - void Flush(); - void ScrubStorage(ScrubContext& Ctx); - CidStoreSize TotalSize() const; + void Initialize(const CidStoreConfiguration& Config); + InsertResult AddChunk(const IoBuffer& ChunkData, const IoHash& RawHash, InsertMode Mode = InsertMode::kMayBeMovedInPlace); + IoBuffer FindChunkByCid(const IoHash& DecompressedId); + bool ContainsChunk(const IoHash& DecompressedId); + void FilterChunks(HashKeySet& InOutChunks); + void Flush(); + void ScrubStorage(ScrubContext& Ctx); + CidStoreSize TotalSize() const; + CidStoreStats Stats() const; private: struct Impl; |