Bug 1689987 - P4: Add a telemetry probe to collect channel success rate when ODoH is used r=necko-reviewers,valentin

Differential Revision: https://phabricator.services.mozilla.com/D105214
This commit is contained in:
Kershaw Chang 2021-02-18 12:50:03 +00:00
parent 9795f890cc
commit 36d1df148d
12 changed files with 108 additions and 11 deletions

View File

@ -44,6 +44,7 @@ already_AddRefed<ChildDNSService> ChildDNSService::GetSingleton() {
return nullptr; return nullptr;
} }
gChildDNSService = new ChildDNSService(); gChildDNSService = new ChildDNSService();
gChildDNSService->Init();
ClearOnShutdown(&gChildDNSService); ClearOnShutdown(&gChildDNSService);
} }
@ -53,9 +54,7 @@ already_AddRefed<ChildDNSService> ChildDNSService::GetSingleton() {
NS_IMPL_ISUPPORTS(ChildDNSService, nsIDNSService, nsPIDNSService, nsIObserver) NS_IMPL_ISUPPORTS(ChildDNSService, nsIDNSService, nsPIDNSService, nsIObserver)
ChildDNSService::ChildDNSService() ChildDNSService::ChildDNSService()
: mFirstTime(true), : mPendingRequestsLock("DNSPendingRequestsLock") {
mDisablePrefetch(false),
mPendingRequestsLock("DNSPendingRequestsLock") {
MOZ_ASSERT_IF(nsIOService::UseSocketProcess(), MOZ_ASSERT_IF(nsIOService::UseSocketProcess(),
XRE_IsContentProcess() || XRE_IsParentProcess()); XRE_IsContentProcess() || XRE_IsParentProcess());
MOZ_ASSERT_IF(!nsIOService::UseSocketProcess(), MOZ_ASSERT_IF(!nsIOService::UseSocketProcess(),
@ -332,6 +331,14 @@ ChildDNSService::GetMyHostName(nsACString& result) {
return NS_ERROR_NOT_AVAILABLE; return NS_ERROR_NOT_AVAILABLE;
} }
NS_IMETHODIMP
ChildDNSService::GetODoHActivated(bool* aResult) {
NS_ENSURE_ARG(aResult);
*aResult = mODoHActivated;
return NS_OK;
}
void ChildDNSService::NotifyRequestDone(DNSRequestSender* aDnsRequest) { void ChildDNSService::NotifyRequestDone(DNSRequestSender* aDnsRequest) {
// We need the original flags and listener for the pending requests hash. // We need the original flags and listener for the pending requests hash.
uint32_t originalFlags = aDnsRequest->mFlags & ~RESOLVE_OFFLINE; uint32_t originalFlags = aDnsRequest->mFlags & ~RESOLVE_OFFLINE;
@ -385,6 +392,12 @@ nsresult ChildDNSService::Init() {
// If a manual proxy is in use, disable prefetch implicitly // If a manual proxy is in use, disable prefetch implicitly
prefs->AddObserver("network.proxy.type", this, false); prefs->AddObserver("network.proxy.type", this, false);
} }
nsCOMPtr<nsIObserverService> observerService =
mozilla::services::GetObserverService();
if (observerService) {
observerService->AddObserver(this, "odoh-service-activated", false);
}
} }
mDisablePrefetch = mDisablePrefetch =
@ -433,12 +446,13 @@ ChildDNSService::ResetExcludedSVCDomainName(const nsACString& aOwnerName) {
NS_IMETHODIMP NS_IMETHODIMP
ChildDNSService::Observe(nsISupports* subject, const char* topic, ChildDNSService::Observe(nsISupports* subject, const char* topic,
const char16_t* data) { const char16_t* data) {
// we are only getting called if a preference has changed. if (!strcmp(topic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) {
NS_ASSERTION(strcmp(topic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) == 0, // Reread prefs
"unexpected observe call"); Init();
} else if (!strcmp(topic, "odoh-service-activated")) {
mODoHActivated = u"true"_ns.Equals(data);
}
// Reread prefs
Init();
return NS_OK; return NS_OK;
} }

View File

@ -53,8 +53,9 @@ class ChildDNSService final : public nsPIDNSService, public nsIObserver {
nsIDNSResolverInfo* aResolver, nsIDNSListener* aListener, nsIDNSResolverInfo* aResolver, nsIDNSListener* aListener,
nsresult aReason, const OriginAttributes& aOriginAttributes); nsresult aReason, const OriginAttributes& aOriginAttributes);
bool mFirstTime; bool mFirstTime = true;
bool mDisablePrefetch; bool mDisablePrefetch = false;
bool mODoHActivated = false;
// We need to remember pending dns requests to be able to cancel them. // We need to remember pending dns requests to be able to cancel them.
nsClassHashtable<nsCStringHashKey, nsTArray<RefPtr<DNSRequestSender>>> nsClassHashtable<nsCStringHashKey, nsTArray<RefPtr<DNSRequestSender>>>

View File

@ -5,11 +5,13 @@
#include "ODoHService.h" #include "ODoHService.h"
#include "mozilla/net/SocketProcessChild.h"
#include "mozilla/Preferences.h" #include "mozilla/Preferences.h"
#include "mozilla/StaticPrefs_network.h" #include "mozilla/StaticPrefs_network.h"
#include "nsIDNSService.h" #include "nsIDNSService.h"
#include "nsIDNSByTypeRecord.h" #include "nsIDNSByTypeRecord.h"
#include "nsIOService.h" #include "nsIOService.h"
#include "nsIObserverService.h"
#include "ODoH.h" #include "ODoH.h"
#include "TRRService.h" #include "TRRService.h"
#include "nsURLHelper.h" #include "nsURLHelper.h"
@ -241,6 +243,31 @@ ODoHService::OnLookupComplete(nsICancelable* aRequest, nsIDNSRecord* aRec,
mODoHConfigs.reset(); mODoHConfigs.reset();
mODoHConfigs.emplace(std::move(configs)); mODoHConfigs.emplace(std::move(configs));
// Let observers know whether ODoHService is activated or not.
bool hasODoHConfigs = !mODoHConfigs->IsEmpty();
auto task = [hasODoHConfigs]() {
MOZ_ASSERT(NS_IsMainThread());
if (XRE_IsSocketProcess()) {
SocketProcessChild::GetSingleton()->SendODoHServiceActivated(
hasODoHConfigs);
}
nsCOMPtr<nsIObserverService> observerService =
mozilla::services::GetObserverService();
if (observerService) {
observerService->NotifyObservers(nullptr, "odoh-service-activated",
hasODoHConfigs ? u"true" : u"false");
}
};
if (NS_IsMainThread()) {
task();
} else {
NS_DispatchToMainThread(
NS_NewRunnableFunction("ODoHService::Activated", std::move(task)));
}
if (!mPendingRequests.IsEmpty()) { if (!mPendingRequests.IsEmpty()) {
nsTArray<RefPtr<ODoH>> requests = std::move(mPendingRequests); nsTArray<RefPtr<ODoH>> requests = std::move(mPendingRequests);
nsCOMPtr<nsIEventTarget> target = gTRRService->MainThreadOrTRRThread(); nsCOMPtr<nsIEventTarget> target = gTRRService->MainThreadOrTRRThread();

View File

@ -777,6 +777,7 @@ nsDNSService::Init() {
observerService->AddObserver(this, "last-pb-context-exited", false); observerService->AddObserver(this, "last-pb-context-exited", false);
observerService->AddObserver(this, NS_NETWORK_LINK_TOPIC, false); observerService->AddObserver(this, NS_NETWORK_LINK_TOPIC, false);
observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false); observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false);
observerService->AddObserver(this, "odoh-service-activated", false);
} }
RefPtr<nsHostResolver> res; RefPtr<nsHostResolver> res;
@ -1242,6 +1243,14 @@ nsDNSService::GetMyHostName(nsACString& result) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
NS_IMETHODIMP
nsDNSService::GetODoHActivated(bool* aResult) {
NS_ENSURE_ARG(aResult);
*aResult = mODoHActivated;
return NS_OK;
}
NS_IMETHODIMP NS_IMETHODIMP
nsDNSService::Observe(nsISupports* subject, const char* topic, nsDNSService::Observe(nsISupports* subject, const char* topic,
const char16_t* data) { const char16_t* data) {
@ -1262,6 +1271,8 @@ nsDNSService::Observe(nsISupports* subject, const char* topic,
} }
} else if (!strcmp(topic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) { } else if (!strcmp(topic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) {
Shutdown(); Shutdown();
} else if (!strcmp(topic, "odoh-service-activated")) {
mODoHActivated = u"true"_ns.Equals(data);
} }
if (flushCache && mResolver) { if (flushCache && mResolver) {

View File

@ -103,6 +103,7 @@ class nsDNSService final : public nsPIDNSService,
uint32_t mResCacheExpiration; uint32_t mResCacheExpiration;
uint32_t mResCacheGrace; uint32_t mResCacheGrace;
bool mResolverPrefsUpdated; bool mResolverPrefsUpdated;
bool mODoHActivated = false;
nsClassHashtable<nsCStringHashKey, nsTArray<nsCString>> mFailedSVCDomainNames; nsClassHashtable<nsCStringHashKey, nsTArray<nsCString>> mFailedSVCDomainNames;
}; };

View File

@ -243,6 +243,12 @@ interface nsIDNSService : nsISupports
*/ */
readonly attribute AUTF8String myHostName; readonly attribute AUTF8String myHostName;
/**
* Returns true when we have valid ODoHConfigs to encrypt/decrypt oblivious
* DNS packets.
*/
readonly attribute boolean ODoHActivated;
/************************************************************************* /*************************************************************************
* Listed below are the various flags that may be OR'd together to form * Listed below are the various flags that may be OR'd together to form
* the aFlags parameter passed to asyncResolve() and resolve(). * the aFlags parameter passed to asyncResolve() and resolve().

View File

@ -128,6 +128,7 @@ parent:
OriginAttributes aOriginAttributes, OriginAttributes aOriginAttributes,
nsCString aRequestString) nsCString aRequestString)
returns (bool aAccepted); returns (bool aAccepted);
async ODoHServiceActivated(bool aActivated);
child: child:
async Init(SocketPorcessInitAttributes aAttributes); async Init(SocketPorcessInitAttributes aAttributes);

View File

@ -22,6 +22,7 @@
#include "mozilla/TelemetryIPC.h" #include "mozilla/TelemetryIPC.h"
#include "nsIAppStartup.h" #include "nsIAppStartup.h"
#include "nsIHttpActivityObserver.h" #include "nsIHttpActivityObserver.h"
#include "nsIObserverService.h"
#include "nsNSSIOLayer.h" #include "nsNSSIOLayer.h"
#include "PSMIPCCommon.h" #include "PSMIPCCommon.h"
#include "secerr.h" #include "secerr.h"
@ -425,5 +426,17 @@ SocketProcessParent::RecvPRemoteLazyInputStreamConstructor(
return IPC_OK(); return IPC_OK();
} }
mozilla::ipc::IPCResult SocketProcessParent::RecvODoHServiceActivated(
const bool& aActivated) {
nsCOMPtr<nsIObserverService> observerService =
mozilla::services::GetObserverService();
if (observerService) {
observerService->NotifyObservers(nullptr, "odoh-service-activated",
aActivated ? u"true" : u"false");
}
return IPC_OK();
}
} // namespace net } // namespace net
} // namespace mozilla } // namespace mozilla

View File

@ -119,6 +119,8 @@ class SocketProcessParent final
PRemoteLazyInputStreamParent* aActor, const nsID& aID, PRemoteLazyInputStreamParent* aActor, const nsID& aID,
const uint64_t& aSize); const uint64_t& aSize);
mozilla::ipc::IPCResult RecvODoHServiceActivated(const bool& aActivated);
private: private:
SocketProcessHost* mHost; SocketProcessHost* mHost;
UniquePtr<dom::MemoryReportRequestHost> mMemoryReportRequest; UniquePtr<dom::MemoryReportRequestHost> mMemoryReportRequest;

View File

@ -7312,7 +7312,17 @@ nsHttpChannel::OnStartRequest(nsIRequest* request) {
NS_SUCCEEDED(mStatus)); NS_SUCCEEDED(mStatus));
} }
if (gTRRService && gTRRService->IsConfirmed()) { if (StaticPrefs::network_trr_odoh_enabled()) {
nsCOMPtr<nsIDNSService> dns = do_GetService(NS_DNSSERVICE_CONTRACTID);
bool ODoHActivated = false;
if (dns && NS_SUCCEEDED(dns->GetODoHActivated(&ODoHActivated)) &&
ODoHActivated) {
Telemetry::Accumulate(Telemetry::HTTP_CHANNEL_ONSTART_SUCCESS_ODOH,
NS_SUCCEEDED(mStatus));
}
} else if (gTRRService && gTRRService->IsConfirmed()) {
// Note this telemetry probe is not working when DNS resolution is done in
// the socket process.
Telemetry::Accumulate(Telemetry::HTTP_CHANNEL_ONSTART_SUCCESS_TRR, Telemetry::Accumulate(Telemetry::HTTP_CHANNEL_ONSTART_SUCCESS_TRR,
TRRService::AutoDetectedKey(), NS_SUCCEEDED(mStatus)); TRRService::AutoDetectedKey(), NS_SUCCEEDED(mStatus));
} }

View File

@ -171,6 +171,7 @@ add_task(async function testODoHQueryA() {
inRecord.QueryInterface(Ci.nsIDNSAddrRecord); inRecord.QueryInterface(Ci.nsIDNSAddrRecord);
let answer = inRecord.getNextAddrAsString(); let answer = inRecord.getNextAddrAsString();
Assert.equal(answer, expectedIP); Assert.equal(answer, expectedIP);
Assert.ok(dns.ODoHActivated);
}); });
add_task(async function testODoHQueryAAAA() { add_task(async function testODoHQueryAAAA() {
@ -199,4 +200,5 @@ add_task(async function testODoHQueryAAAA() {
inRecord.QueryInterface(Ci.nsIDNSAddrRecord); inRecord.QueryInterface(Ci.nsIDNSAddrRecord);
let answer = inRecord.getNextAddrAsString(); let answer = inRecord.getNextAddrAsString();
Assert.equal(answer, expectedIP); Assert.equal(answer, expectedIP);
Assert.ok(dns.ODoHActivated);
}); });

View File

@ -3159,6 +3159,15 @@
"bug_numbers": [1682552], "bug_numbers": [1682552],
"alert_emails": ["necko@mozilla.com", "kershaw@mozilla.com"] "alert_emails": ["necko@mozilla.com", "kershaw@mozilla.com"]
}, },
"HTTP_CHANNEL_ONSTART_SUCCESS_ODOH" : {
"record_in_processes": ["main"],
"products": ["firefox"],
"expires_in_version": "never",
"kind": "boolean",
"description": "Successfully started HTTP channels when ODoH is enabled",
"bug_numbers": [1689987],
"alert_emails": ["necko@mozilla.com", "kershaw@mozilla.com"]
},
"HTTP_CONNECTION_ENTRY_CACHE_HIT_1" : { "HTTP_CONNECTION_ENTRY_CACHE_HIT_1" : {
"record_in_processes": ["main", "content"], "record_in_processes": ["main", "content"],
"products": ["firefox", "fennec"], "products": ["firefox", "fennec"],