Conversation
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
for clarification: Is this isContentBitrateEvent filtering required for checking which events has the bitrate information based on event?
I feel the events DOWNLOAD, CONTENT_SEEK_END also contain bitrate information. So instead of this, can we rely on checking the currentBitrate attribute exists or not for filtering if it works?
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
|
nova review |
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
why can't we use timeSinceStarted?
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Why are we not using timeSinceStarted ?
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
NewRelicVideoCore/src/main/java/com/newrelic/videoagent/core/tracker/NRVideoTracker.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Can we please check from which version this Math.addExact supports?
There was a problem hiding this comment.
replaced it with a custom method
|
Not Required need to push to stable-beta |
|
not required |
KPIs are calculated based on this doc - https://newrelic.atlassian.net/wiki/spaces/VERTSOL/pages/4702274467/KPIs+Transformation+QOE+Score
kpi.startupTime
kpi.startupTime = timeSinceRequested
Source: TimeSince mechanism tracking time from CONTENT_REQUEST to current moment
kpi.peakBitrate
Formula: Maximum value tracking
kpi.peakBitrate = MAX(bitrate_1, bitrate_2, ..., bitrate_n)
kpi.hadStartupFailure
Formula: Boolean logic based on playback state
kpi.hadStartupFailure = (timeSinceStarted == null)
Logic:
true = Error occurred before CONTENT_START (no timeSinceStarted attribute exists)
false = Playback started successfully
kpi.hadPlaybackFailure
Formula: Boolean flag set on error during playback
kpi.hadPlaybackFailure = qoeHadPlaybackFailure
Tracking Logic:
// On CONTENT_ERROR:
kpi.totalRebufferingTime
Formula: Cumulative sum of rebuffering durations
kpi.totalRebufferingTime = Σ(rebuffer_duration_i) where buffer_type ≠ "initial"
Tracking Logic:
// On each CONTENT_BUFFER_END:
kpi.rebufferingRatio
Formula: Percentage of time spent rebuffering
double rebufferingRatio = ((double) qoeTotalRebufferingTime / totalPlaytime) * 100;
Formula: Direct attribute mapping
kpi.totalPlaytime = totalPlaytime
Source: Accumulated through updatePlaytime() mechanism
kpi.averageBitrate (NEW: Time-Weighted)
Formula: Time-weighted average of bitrates
// Primary calculation (time-weighted):
if (qoeTotalActiveTime > 0) {
kpi.averageBitrate = qoeTotalBitrateWeightedTime / qoeTotalActiveTime
}
// Fallback calculation (simple average):
else if (qoeBitrateCount > 0) {
kpi.averageBitrate = qoeBitrateSum / qoeBitrateCount
}
Time-Weighted Tracking:
// On each rendition change:
segmentDuration = currentTime - qoeLastRenditionChangeTime
qoeTotalBitrateWeightedTime += (previousBitrate × segmentDuration)
qoeTotalActiveTime += segmentDuration
// During calculation, include current segment:
currentSegmentDuration = currentTime - qoeLastRenditionChangeTime
totalWeightedTime = qoeTotalBitrateWeightedTime + (currentBitrate × currentSegmentDuration)
totalTime = qoeTotalActiveTime + currentSegmentDuration
averageBitrate = totalWeightedTime / totalTime
Mathematical Representation:
Average = Σ(bitrate_i × duration_i) / Σ(duration_i)
Where:
bitrate_i = bitrate during segment i
duration_i = time duration of segment i
i = 1 to n rendition changes
#58
https://docs.google.com/spreadsheets/d/1nW-WDhA-cCbCKpb_EowY99d7VKGAduy9KyxlYW1elvY/edit?gid=1943942889#gid=1943942889