Bug 1187760 - Add telemetry to record navigator.requestMediaKeySystemAccess latency. r=edwin,vladan

This commit is contained in:
Chris Pearce 2015-09-23 16:43:46 +12:00
Родитель 4ebdbb181a
Коммит 1dce7bcb10
4 изменённых файлов: 90 добавлений и 6 удалений

Просмотреть файл

@ -2841,8 +2841,11 @@ Navigator::RequestMediaKeySystemAccess(const nsAString& aKeySystem,
EME_LOG(logMsg.get()); EME_LOG(logMsg.get());
nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(mWindow); nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(mWindow);
nsRefPtr<DetailedPromise> promise = DetailedPromise::Create(go, aRv, nsRefPtr<DetailedPromise> promise =
NS_LITERAL_CSTRING("navigator.requestMediaKeySystemAccess")); DetailedPromise::Create(go, aRv,
NS_LITERAL_CSTRING("navigator.requestMediaKeySystemAccess"),
Telemetry::VIDEO_EME_REQUEST_SUCCESS_LATENCY_MS,
Telemetry::VIDEO_EME_REQUEST_FAILURE_LATENCY_MS);
if (aRv.Failed()) { if (aRv.Failed()) {
return nullptr; return nullptr;
} }

Просмотреть файл

@ -16,12 +16,24 @@ DetailedPromise::DetailedPromise(nsIGlobalObject* aGlobal,
: Promise(aGlobal) : Promise(aGlobal)
, mName(aName) , mName(aName)
, mResponded(false) , mResponded(false)
, mStartTime(TimeStamp::Now())
{ {
} }
DetailedPromise::DetailedPromise(nsIGlobalObject* aGlobal,
const nsACString& aName,
Telemetry::ID aSuccessLatencyProbe,
Telemetry::ID aFailureLatencyProbe)
: DetailedPromise(aGlobal, aName)
{
mSuccessLatencyProbe.Construct(aSuccessLatencyProbe);
mFailureLatencyProbe.Construct(aFailureLatencyProbe);
}
DetailedPromise::~DetailedPromise() DetailedPromise::~DetailedPromise()
{ {
MOZ_ASSERT(mResponded == IsPending()); MOZ_ASSERT(mResponded == IsPending());
MaybeReportTelemetry(Failed);
} }
void void
@ -31,7 +43,7 @@ DetailedPromise::MaybeReject(nsresult aArg, const nsACString& aReason)
PromiseFlatCString(aReason).get()); PromiseFlatCString(aReason).get());
EME_LOG(msg.get()); EME_LOG(msg.get());
mResponded = true; MaybeReportTelemetry(Failed);
LogToBrowserConsole(NS_ConvertUTF8toUTF16(msg)); LogToBrowserConsole(NS_ConvertUTF8toUTF16(msg));
@ -56,5 +68,35 @@ DetailedPromise::Create(nsIGlobalObject* aGlobal,
return aRv.Failed() ? nullptr : promise.forget(); return aRv.Failed() ? nullptr : promise.forget();
} }
/* static */ already_AddRefed<DetailedPromise>
DetailedPromise::Create(nsIGlobalObject* aGlobal,
ErrorResult& aRv,
const nsACString& aName,
Telemetry::ID aSuccessLatencyProbe,
Telemetry::ID aFailureLatencyProbe)
{
nsRefPtr<DetailedPromise> promise = new DetailedPromise(aGlobal, aName, aSuccessLatencyProbe, aFailureLatencyProbe);
promise->CreateWrapper(nullptr, aRv);
return aRv.Failed() ? nullptr : promise.forget();
}
void
DetailedPromise::MaybeReportTelemetry(Status aStatus)
{
if (mResponded) {
return;
}
mResponded = true;
if (!mSuccessLatencyProbe.WasPassed() || !mFailureLatencyProbe.WasPassed()) {
return;
}
uint32_t latency = (TimeStamp::Now() - mStartTime).ToMilliseconds();
EME_LOG("%s %s latency %ums reported via telemetry", mName.get(),
((aStatus == Succeeded) ? "succcess" : "failure"), latency);
Telemetry::ID tid = (aStatus == Succeeded) ? mSuccessLatencyProbe.Value()
: mFailureLatencyProbe.Value();
Telemetry::Accumulate(tid, latency);
}
} // namespace dom } // namespace dom
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -8,6 +8,7 @@
#define __DetailedPromise_h__ #define __DetailedPromise_h__
#include "mozilla/dom/Promise.h" #include "mozilla/dom/Promise.h"
#include "mozilla/Telemetry.h"
#include "EMEUtils.h" #include "EMEUtils.h"
namespace mozilla { namespace mozilla {
@ -22,13 +23,21 @@ class DetailedPromise : public Promise
{ {
public: public:
static already_AddRefed<DetailedPromise> static already_AddRefed<DetailedPromise>
Create(nsIGlobalObject* aGlobal, ErrorResult& aRv, const nsACString& aName); Create(nsIGlobalObject* aGlobal,
ErrorResult& aRv,
const nsACString& aName);
static already_AddRefed<DetailedPromise>
Create(nsIGlobalObject* aGlobal, ErrorResult& aRv,
const nsACString& aName,
Telemetry::ID aSuccessLatencyProbe,
Telemetry::ID aFailureLatencyProbe);
template <typename T> template <typename T>
void MaybeResolve(const T& aArg) void MaybeResolve(const T& aArg)
{ {
EME_LOG("%s promise resolved", mName.get()); EME_LOG("%s promise resolved", mName.get());
mResponded = true; MaybeReportTelemetry(Succeeded);
Promise::MaybeResolve<T>(aArg); Promise::MaybeResolve<T>(aArg);
} }
@ -39,11 +48,23 @@ public:
void MaybeReject(ErrorResult&, const nsACString& aReason); void MaybeReject(ErrorResult&, const nsACString& aReason);
private: private:
explicit DetailedPromise(nsIGlobalObject* aGlobal, const nsACString& aName); explicit DetailedPromise(nsIGlobalObject* aGlobal,
const nsACString& aName);
explicit DetailedPromise(nsIGlobalObject* aGlobal,
const nsACString& aName,
Telemetry::ID aSuccessLatencyProbe,
Telemetry::ID aFailureLatencyProbe);
virtual ~DetailedPromise(); virtual ~DetailedPromise();
enum Status { Succeeded, Failed };
void MaybeReportTelemetry(Status aStatus);
nsCString mName; nsCString mName;
bool mResponded; bool mResponded;
TimeStamp mStartTime;
Optional<Telemetry::ID> mSuccessLatencyProbe;
Optional<Telemetry::ID> mFailureLatencyProbe;
}; };
} // namespace dom } // namespace dom

Просмотреть файл

@ -9383,6 +9383,24 @@
"releaseChannelCollection": "opt-out", "releaseChannelCollection": "opt-out",
"description": "Reason for reporting the Adobe CDM to be unsupported. (1 = NOT_WINDOWS; 2 = WINDOWS_VERSION)" "description": "Reason for reporting the Adobe CDM to be unsupported. (1 = NOT_WINDOWS; 2 = WINDOWS_VERSION)"
}, },
"VIDEO_EME_REQUEST_SUCCESS_LATENCY_MS": {
"alert_emails": ["cpearce@mozilla.com"],
"expires_in_version": "50",
"kind": "exponential",
"high": "60000",
"n_buckets": 60,
"releaseChannelCollection": "opt-out",
"description": "Time spent waiting for a navigator.requestMediaKeySystemAccess call to succeed."
},
"VIDEO_EME_REQUEST_FAILURE_LATENCY_MS": {
"alert_emails": ["cpearce@mozilla.com"],
"expires_in_version": "50",
"kind": "exponential",
"high": "60000",
"n_buckets": 60,
"releaseChannelCollection": "opt-out",
"description": "Time spent waiting for a navigator.requestMediaKeySystemAccess call to fail."
},
"FXA_CONFIGURED": { "FXA_CONFIGURED": {
"alert_emails": ["fx-team@mozilla.com"], "alert_emails": ["fx-team@mozilla.com"],
"expires_in_version": "45", "expires_in_version": "45",