Skip to content

Commit

Permalink
Merge pull request #1647 from cloudflare/jsnell/trace-heap-snapshot-m…
Browse files Browse the repository at this point in the history
…emory-tracker
  • Loading branch information
jasnell authored Feb 9, 2024
2 parents f5a0017 + b6f2ff5 commit e2d7a6f
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/workerd/api/sql.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ class SqlStorage::Cursor final: public jsg::Object {
JSG_ITERATOR(RawIterator, raw, kj::Array<Value>, jsg::Ref<Cursor>, rawIteratorNext);

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
if (state != nullptr) {
if (state != kj::none) {
tracker.trackFieldWithSize("IoOwn<State>", sizeof(IoOwn<State>));
}
tracker.trackField("statement", statement);
Expand Down
81 changes: 81 additions & 0 deletions src/workerd/api/trace.c++
Original file line number Diff line number Diff line change
Expand Up @@ -627,4 +627,85 @@ auto TraceCustomEventImpl::sendRpc(
};
}

void TailEvent::visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
for (const auto& event : events) {
tracker.trackField(nullptr, event);
}
}

void TraceItem::visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
KJ_IF_SOME(event, eventInfo) {
KJ_SWITCH_ONEOF(event) {
KJ_CASE_ONEOF(info, jsg::Ref<FetchEventInfo>) {
tracker.trackField("eventInfo", info);
}
KJ_CASE_ONEOF(info, jsg::Ref<ScheduledEventInfo>) {
tracker.trackField("eventInfo", info);
}
KJ_CASE_ONEOF(info, jsg::Ref<AlarmEventInfo>) {
tracker.trackField("eventInfo", info);
}
KJ_CASE_ONEOF(info, jsg::Ref<QueueEventInfo>) {
tracker.trackField("eventInfo", info);
}
KJ_CASE_ONEOF(info, jsg::Ref<EmailEventInfo>) {
tracker.trackField("eventInfo", info);
}
KJ_CASE_ONEOF(info, jsg::Ref<TailEventInfo>) {
tracker.trackField("eventInfo", info);
}
KJ_CASE_ONEOF(info, jsg::Ref<CustomEventInfo>) {
tracker.trackField("eventInfo", info);
}
KJ_CASE_ONEOF(info, jsg::Ref<HibernatableWebSocketEventInfo>) {
tracker.trackField("eventInfo", info);
}
}
}
for (const auto& log : logs) {
tracker.trackField("log", log);
}
for (const auto& exception: exceptions) {
tracker.trackField("exception", exception);
}
for (const auto& event: diagnosticChannelEvents) {
tracker.trackField("diagnosticChannelEvent", event);
}
tracker.trackField("scriptName", scriptName);
tracker.trackField("scriptVersion", scriptVersion);
tracker.trackField("dispatchNamespace", dispatchNamespace);
KJ_IF_SOME(tags, scriptTags) {
for (const auto& tag: tags) {
tracker.trackField("scriptTag", tag);
}
}
tracker.trackField("outcome", outcome);
}

void TraceItem::FetchEventInfo::visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("request", request);
tracker.trackField("response", response);
}

void TraceItem::TailEventInfo::visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
for (const auto& event : consumedEvents) {
tracker.trackField(nullptr, event);
}
}

void TraceItem::HibernatableWebSocketEventInfo::visitForMemoryInfo(
jsg::MemoryTracker& tracker) const {
KJ_SWITCH_ONEOF(eventType) {
KJ_CASE_ONEOF(message, jsg::Ref<Message>) {
tracker.trackField("message", message);
}
KJ_CASE_ONEOF(close, jsg::Ref<Close>) {
tracker.trackField("close", close);
}
KJ_CASE_ONEOF(error, jsg::Ref<Error>) {
tracker.trackField("error", error);
}
}
}

} // namespace workerd::api
61 changes: 61 additions & 0 deletions src/workerd/api/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ class TailEvent final: public ExtendableEvent {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(traces, getEvents);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const;

private:
kj::Array<jsg::Ref<TraceItem>> events;

Expand All @@ -54,6 +56,12 @@ struct ScriptVersion {
jsg::Optional<kj::String> message;

JSG_STRUCT(id, tag, message);

JSG_MEMORY_INFO(ScriptVersion) {
tracker.trackField("id", id);
tracker.trackField("tag", tag);
tracker.trackField("message", message);
}
};

class TraceItem final: public jsg::Object {
Expand Down Expand Up @@ -105,6 +113,8 @@ class TraceItem final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(outcome, getOutcome);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const;

private:
kj::Maybe<EventInfo> eventInfo;
kj::Maybe<double> eventTimestamp;
Expand Down Expand Up @@ -156,6 +166,8 @@ class TraceItem::FetchEventInfo final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(request, getRequest);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const;

private:
jsg::Ref<Request> request;
jsg::Optional<jsg::Ref<Response>> response;
Expand All @@ -173,6 +185,15 @@ class TraceItem::FetchEventInfo::Request final: public jsg::Object {
kj::Array<Trace::FetchEventInfo::Header> headers,
kj::String method,
kj::String url);

JSG_MEMORY_INFO(Detail) {
tracker.trackField("cf", cf);
for (const auto& header : headers) {
tracker.trackField(nullptr, header);
}
tracker.trackField("method", method);
tracker.trackField("url", url);
}
};

explicit Request(jsg::Lock& js, const Trace& trace, const Trace::FetchEventInfo& eventInfo);
Expand All @@ -196,6 +217,10 @@ class TraceItem::FetchEventInfo::Request final: public jsg::Object {
JSG_METHOD(getUnredacted);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("detail", detail);
}

private:
bool redacted = true;
kj::Own<Detail> detail;
Expand Down Expand Up @@ -227,6 +252,10 @@ class TraceItem::ScheduledEventInfo final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(cron, getCron);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("cron", cron);
}

private:
double scheduledTime;
kj::String cron;
Expand Down Expand Up @@ -259,6 +288,10 @@ class TraceItem::QueueEventInfo final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(batchSize, getBatchSize);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("queueName", queueName);
}

private:
kj::String queueName;
uint32_t batchSize;
Expand All @@ -278,6 +311,11 @@ class TraceItem::EmailEventInfo final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(rawSize, getRawSize);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("mailFrom", mailFrom);
tracker.trackField("rcptTo", rcptTo);
}

private:
kj::String mailFrom;
kj::String rcptTo;
Expand All @@ -296,6 +334,8 @@ class TraceItem::TailEventInfo final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(consumedEvents, getConsumedEvents);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const;

private:
kj::Array<jsg::Ref<TailItem>> consumedEvents;
};
Expand All @@ -310,6 +350,10 @@ class TraceItem::TailEventInfo::TailItem final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(scriptName, getScriptName);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("scriptName", scriptName);
}

private:
kj::Maybe<kj::String> scriptName;
};
Expand All @@ -335,6 +379,8 @@ class TraceItem::HibernatableWebSocketEventInfo final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(getWebSocketEvent, getEvent);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const;

private:
Type eventType;
};
Expand Down Expand Up @@ -418,6 +464,11 @@ class TraceDiagnosticChannelEvent final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(message, getMessage);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("channel", channel);
tracker.trackFieldWithSize("message", message.size());
}

private:
double timestamp;
kj::String channel;
Expand All @@ -438,6 +489,11 @@ class TraceLog final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(message, getMessage);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("level", level);
tracker.trackField("message", message);
}

private:
double timestamp;
kj::String level;
Expand All @@ -458,6 +514,11 @@ class TraceException final: public jsg::Object {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(name, getName);
}

void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
tracker.trackField("name", name);
tracker.trackField("message", message);
}

private:
double timestamp;
kj::String name;
Expand Down
1 change: 1 addition & 0 deletions src/workerd/io/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ wd_cc_library(
visibility = ["//visibility:public"],
deps = [
":capnp",
"//src/workerd/jsg:memory-tracker",
"//src/workerd/util:own-util",
"//src/workerd/util:perfetto",
"//src/workerd/util:thread-scopes",
Expand Down
6 changes: 6 additions & 0 deletions src/workerd/io/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <workerd/io/outcome.capnp.h>
#include <workerd/io/worker-interface.capnp.h>
#include <workerd/util/own-util.h>
#include <workerd/jsg/memory.h>

namespace kj {
enum class HttpMethod;
Expand Down Expand Up @@ -73,6 +74,11 @@ class Trace final : public kj::Refcounted {
kj::String value;

void copyTo(rpc::Trace::FetchEventInfo::Header::Builder builder);

JSG_MEMORY_INFO(Header) {
tracker.trackField("name", name);
tracker.trackField("value", value);
}
};

kj::HttpMethod method;
Expand Down

0 comments on commit e2d7a6f

Please sign in to comment.