Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5f25593 authored by Frank Li's avatar Frank Li Committed by android-build-merger
Browse files

Merge "logging to statsd by native static libs"

am: 470173795f

Change-Id: Ib178e235ab530527dd5b43fe6d2aceb83bc3e2e1
parents 2e416c19 0d033ea4
Loading
Loading
Loading
Loading
+49 −1
Original line number Diff line number Diff line
@@ -84,14 +84,18 @@ cc_library {
        "liblog",
        "libnetdutils",
        "libssl",
        "libstatslog_resolv",
        "libstatssocket",
        "libsysutils",
        "libutils",
        "netd_event_listener_interface-ndk_platform",
        "dnsresolver_aidl_interface-ndk_platform",
        "server_configurable_flags",
        "stats_proto",
        "libprotobuf-cpp-lite",
    ],
    shared_libs: [
        "libbinder_ndk",
        "libstatslog",
    ],
    include_dirs: [
        "system/netd/include",
@@ -109,6 +113,50 @@ cc_library {
    },
}

cc_library_static {
    name: "stats_proto",
    defaults: ["netd_defaults"],
    proto: {
        export_proto_headers: true,
        type: "lite",
    },
    srcs: [
        "stats.proto",
    ],
}

genrule {
    name: "statslog_resolv.h",
    tools: ["stats-log-api-gen"],
    cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog_resolv.h --module resolv --namespace android,net,stats",
    out: [
        "statslog_resolv.h",
    ],
}

genrule {
    name: "statslog_resolv.cpp",
    tools: ["stats-log-api-gen"],
    cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog_resolv.cpp --module resolv --namespace android,net,stats --importHeader statslog_resolv.h",
    out: [
        "statslog_resolv.cpp",
    ],
}

cc_library_static {
    name: "libstatslog_resolv",
    generated_sources: ["statslog_resolv.cpp"],
    generated_headers: ["statslog_resolv.h"],
    defaults: ["netd_defaults"],
    export_generated_headers: ["statslog_resolv.h"],
    static_libs: [
        "libcutils",
        "liblog",
        "libstatssocket",
        "libutils",
    ],
}

cc_test {
    name: "resolv_integration_test",
    test_suites: ["device-tests"],
+25 −12
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@
#include <netdutils/ThreadUtil.h>
#include <private/android_filesystem_config.h>  // AID_SYSTEM
#include <resolv.h>
#include <statslog.h>
#include <statslog_resolv.h>
#include <sysutils/SocketClient.h>

#include "DnsResolver.h"
@@ -55,8 +55,10 @@
#include "ResolverEventReporter.h"
#include "netd_resolv/stats.h"  // RCODE_TIMEOUT
#include "resolv_private.h"
#include "stats.pb.h"

using aidl::android::net::metrics::INetdEventListener;
using android::net::NetworkDnsEventReported;

namespace android {

@@ -294,10 +296,16 @@ bool parseQuery(const uint8_t* msg, size_t msgLen, uint16_t* query_id, int* rr_t
}

void reportDnsEvent(int eventType, const android_net_context& netContext, int latencyUs,
                    int returnCode, const std::string& query_name,
                    const std::vector<std::string>& ip_addrs = {}, int total_ip_addr_count = 0) {
    android::util::stats_write(android::util::NETWORK_DNS_EVENT_REPORTED, eventType, returnCode,
                               latencyUs);
                    int returnCode, const NetworkDnsEventReported& dnsEvent,
                    const std::string& query_name, const std::vector<std::string>& ip_addrs = {},
                    int total_ip_addr_count = 0) {
    std::string dnsQueryStats = dnsEvent.dns_query_events().SerializeAsString();
    char const* dnsQueryStatsBytes = dnsQueryStats.c_str();
    stats::BytesField dnsQueryBytesField{dnsQueryStatsBytes, dnsQueryStats.size()};
    android::net::stats::stats_write(android::net::stats::NETWORK_DNS_EVENT_REPORTED, eventType,
                                     returnCode, latencyUs, dnsEvent.hints_ai_flags(),
                                     dnsEvent.res_nsend_flags(), dnsEvent.network_type(),
                                     dnsEvent.private_dns_modes(), dnsQueryBytesField);

    const auto& listeners = ResolverEventReporter::getInstance().getListeners();
    if (listeners.size() == 0) {
@@ -635,6 +643,7 @@ void DnsProxyListener::GetAddrInfoHandler::run() {
    maybeFixupNetContext(&mNetContext);
    const uid_t uid = mClient->getUid();
    int32_t rv = 0;
    NetworkDnsEventReported dnsEvent;
    if (queryLimiter.start(uid)) {
        rv = android_getaddrinfofornetcontext(mHost, mService, mHints, &mNetContext, &result);
        queryLimiter.finish(uid);
@@ -666,8 +675,8 @@ void DnsProxyListener::GetAddrInfoHandler::run() {
    }
    std::vector<std::string> ip_addrs;
    const int total_ip_addr_count = extractGetAddrInfoAnswers(result, &ip_addrs);
    reportDnsEvent(INetdEventListener::EVENT_GETADDRINFO, mNetContext, latencyUs, rv, mHost,
                   ip_addrs, total_ip_addr_count);
    reportDnsEvent(INetdEventListener::EVENT_GETADDRINFO, mNetContext, latencyUs, rv, dnsEvent,
                   mHost, ip_addrs, total_ip_addr_count);
    freeaddrinfo(result);
    mClient->decRef();
}
@@ -837,6 +846,7 @@ void DnsProxyListener::ResNSendHandler::run() {
    // Send DNS query
    std::vector<uint8_t> ansBuf(MAXPACKET, 0);
    int arcode, nsendAns = -1;
    NetworkDnsEventReported dnsEvent;
    if (queryLimiter.start(uid)) {
        nsendAns = resolv_res_nsend(&mNetContext, msg.data(), msgLen, ansBuf.data(), MAXPACKET,
                                    &arcode, static_cast<ResNsendFlags>(mFlags));
@@ -854,7 +864,7 @@ void DnsProxyListener::ResNSendHandler::run() {
        sendBE32(mClient, nsendAns);
        if (rr_type == ns_t_a || rr_type == ns_t_aaaa) {
            reportDnsEvent(INetdEventListener::EVENT_RES_NSEND, mNetContext, latencyUs,
                           resNSendToAiError(nsendAns, arcode), rr_name);
                           resNSendToAiError(nsendAns, arcode), dnsEvent, rr_name);
        }
        return;
    }
@@ -877,7 +887,8 @@ void DnsProxyListener::ResNSendHandler::run() {
        const int total_ip_addr_count =
                extractResNsendAnswers((uint8_t*) ansBuf.data(), nsendAns, rr_type, &ip_addrs);
        reportDnsEvent(INetdEventListener::EVENT_RES_NSEND, mNetContext, latencyUs,
                       resNSendToAiError(nsendAns, arcode), rr_name, ip_addrs, total_ip_addr_count);
                       resNSendToAiError(nsendAns, arcode), dnsEvent, rr_name, ip_addrs,
                       total_ip_addr_count);
    }
}

@@ -973,6 +984,7 @@ void DnsProxyListener::GetHostByNameHandler::run() {
    const uid_t uid = mClient->getUid();
    hostent* hp = nullptr;
    int32_t rv = 0;
    NetworkDnsEventReported dnsEvent;
    if (queryLimiter.start(uid)) {
        rv = android_gethostbynamefornetcontext(mName, mAf, &mNetContext, &hp);
        queryLimiter.finish(uid);
@@ -1001,8 +1013,8 @@ void DnsProxyListener::GetHostByNameHandler::run() {

    std::vector<std::string> ip_addrs;
    const int total_ip_addr_count = extractGetHostByNameAnswers(hp, &ip_addrs);
    reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, mNetContext, latencyUs, rv, mName,
                   ip_addrs, total_ip_addr_count);
    reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, mNetContext, latencyUs, rv, dnsEvent,
                   mName, ip_addrs, total_ip_addr_count);
    mClient->decRef();
}

@@ -1121,6 +1133,7 @@ void DnsProxyListener::GetHostByAddrHandler::run() {
    const uid_t uid = mClient->getUid();
    hostent* hp = nullptr;
    int32_t rv = 0;
    NetworkDnsEventReported dnsEvent;
    if (queryLimiter.start(uid)) {
        rv = android_gethostbyaddrfornetcontext(mAddress, mAddressLen, mAddressFamily,
                                                &mNetContext, &hp);
@@ -1148,7 +1161,7 @@ void DnsProxyListener::GetHostByAddrHandler::run() {
        LOG(WARNING) << "GetHostByAddrHandler::run: Error writing DNS result to client";
    }

    reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYADDR, mNetContext, latencyUs, rv,
    reportDnsEvent(INetdEventListener::EVENT_GETHOSTBYADDR, mNetContext, latencyUs, rv, dnsEvent,
                   (hp && hp->h_name) ? hp->h_name : "null", {}, 0);
    mClient->decRef();
}

stats.proto

0 → 100644
+249 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
syntax = "proto2";
option optimize_for = LITE_RUNTIME;
package android.net;

enum EventType {
    EVENT_UNKNOWN = 0;
    EVENT_GETADDRINFO = 1;
    EVENT_GETHOSTBYNAME = 2;
    EVENT_GETHOSTBYADDR = 3;
    EVENT_RES_NSEND = 4;
}

// The return value of the DNS resolver for each DNS lookups.
// bionic/libc/include/netdb.h
// system/netd/resolv/include/netd_resolv/resolv.h
enum ReturnCode {
    RC_EAI_NO_ERROR = 0;
    RC_EAI_ADDRFAMILY = 1;
    RC_EAI_AGAIN = 2;
    RC_EAI_BADFLAGS = 3;
    RC_EAI_FAIL = 4;
    RC_EAI_FAMILY = 5;
    RC_EAI_MEMORY = 6;
    RC_EAI_NODATA = 7;
    RC_EAI_NONAME = 8;
    RC_EAI_SERVICE = 9;
    RC_EAI_SOCKTYPE = 10;
    RC_EAI_SYSTEM = 11;
    RC_EAI_BADHINTS = 12;
    RC_EAI_PROTOCOL = 13;
    RC_EAI_OVERFLOW = 14;
    RC_RESOLV_TIMEOUT = 255;
    RC_EAI_MAX = 256;
}

enum NsRcode {
    NS_R_NO_ERROR = 0;  // No error occurred.
    NS_R_FORMERR = 1;   // Format error.
    NS_R_SERVFAIL = 2;  // Server failure.
    NS_R_NXDOMAIN = 3;  // Name error.
    NS_R_NOTIMPL = 4;   // Unimplemented.
    NS_R_REFUSED = 5;   // Operation refused.
    // these are for BIND_UPDATE
    NS_R_YXDOMAIN = 6;  // Name exists
    NS_R_YXRRSET = 7;   // RRset exists
    NS_R_NXRRSET = 8;   // RRset does not exist
    NS_R_NOTAUTH = 9;   // Not authoritative for zone
    NS_R_NOTZONE = 10;  // Zone of record different from zone section
    NS_R_MAX = 11;
    // The following are EDNS extended rcodes
    NS_R_BADVERS = 16;
    // The following are TSIG errors
    // NS_R_BADSIG  = 16,
    NS_R_BADKEY = 17;
    NS_R_BADTIME = 18;
}

// Currently defined type values for resources and queries.
enum NsType {
    NS_T_INVALID = 0;      // Cookie.
    NS_T_A = 1;            // Host address.
    NS_T_NS = 2;           // Authoritative server.
    NS_T_MD = 3;           // Mail destination.
    NS_T_MF = 4;           // Mail forwarder.
    NS_T_CNAME = 5;        // Canonical name.
    NS_T_SOA = 6;          // Start of authority zone.
    NS_T_MB = 7;           // Mailbox domain name.
    NS_T_MG = 8;           // Mail group member.
    NS_T_MR = 9;           // Mail rename name.
    NS_T_NULL = 10;        // Null resource record.
    NS_T_WKS = 11;         // Well known service.
    NS_T_PTR = 12;         // Domain name pointer.
    NS_T_HINFO = 13;       // Host information.
    NS_T_MINFO = 14;       // Mailbox information.
    NS_T_MX = 15;          // Mail routing information.
    NS_T_TXT = 16;         // Text strings.
    NS_T_RP = 17;          // Responsible person.
    NS_T_AFSDB = 18;       // AFS cell database.
    NS_T_X25 = 19;         // X_25 calling address.
    NS_T_ISDN = 20;        // ISDN calling address.
    NS_T_RT = 21;          // Router.
    NS_T_NSAP = 22;        // NSAP address.
    NS_T_NSAP_PTR = 23;    // Reverse NSAP lookup (deprecated).
    NS_T_SIG = 24;         // Security signature.
    NS_T_KEY = 25;         // Security key.
    NS_T_PX = 26;          // X.400 mail mapping.
    NS_T_GPOS = 27;        // Geographical position (withdrawn).
    NS_T_AAAA = 28;        // IPv6 Address.
    NS_T_LOC = 29;         // Location Information.
    NS_T_NXT = 30;         // Next domain (security).
    NS_T_EID = 31;         // Endpoint identifier.
    NS_T_NIMLOC = 32;      // Nimrod Locator.
    NS_T_SRV = 33;         // Server Selection.
    NS_T_ATMA = 34;        // ATM Address
    NS_T_NAPTR = 35;       // Naming Authority PoinTeR
    NS_T_KX = 36;          // Key Exchange
    NS_T_CERT = 37;        // Certification record
    NS_T_A6 = 38;          // IPv6 address (experimental)
    NS_T_DNAME = 39;       // Non-terminal DNAME
    NS_T_SINK = 40;        // Kitchen sink (experimentatl)
    NS_T_OPT = 41;         // EDNS0 option (meta-RR)
    NS_T_APL = 42;         // Address prefix list (RFC 3123)
    NS_T_DS = 43;          // Delegation Signer
    NS_T_SSHFP = 44;       // SSH Fingerprint
    NS_T_IPSECKEY = 45;    // IPSEC Key
    NS_T_RRSIG = 46;       // RRset Signature
    NS_T_NSEC = 47;        // Negative security
    NS_T_DNSKEY = 48;      // DNS Key
    NS_T_DHCID = 49;       // Dynamic host configuratin identifier
    NS_T_NSEC3 = 50;       // Negative security type 3
    NS_T_NSEC3PARAM = 51;  // Negative security type 3 parameters
    NS_T_HIP = 55;         // Host Identity Protocol
    NS_T_SPF = 99;         // Sender Policy Framework
    NS_T_TKEY = 249;       // Transaction key
    NS_T_TSIG = 250;       // Transaction signature.
    NS_T_IXFR = 251;       // Incremental zone transfer.
    NS_T_AXFR = 252;       // Transfer zone of authority.
    NS_T_MAILB = 253;      // Transfer mailbox records.
    NS_T_MAILA = 254;      // Transfer mail agent records.
    NS_T_ANY = 255;        // Wildcard match.
    NS_T_ZXFR = 256;       // BIND-specific, nonstandard.
    NS_T_DLV = 32769;      // DNSSEC look-aside validatation.
    NS_T_MAX = 65536;
}

enum IpVersion {
    IV_UNKNOWN = 0;
    IV_IPV4 = 1;
    IV_IPV6 = 2;
}

enum TransportType {
    TT_UNKNOWN = 0;
    TT_UDP = 1;
    TT_TCP = 2;
    TT_DOT = 3;
}

enum PrivateDnsModes {
    PDM_UNKNOWN = 0;
    PDM_OFF = 1;
    PDM_OPPORTUNISTIC = 2;
    PDM_STRICT = 3;
}

enum Transport {
    // Indicates this network uses a Cellular transport.
    TRANSPORT_DEFAULT = 0;  // TRANSPORT_CELLULAR
    // Indicates this network uses a Wi-Fi transport.
    TRANSPORT_WIFI = 1;
    // Indicates this network uses a Bluetooth transport.
    TRANSPORT_BLUETOOTH = 2;
    // Indicates this network uses an Ethernet transport.
    TRANSPORT_ETHERNET = 3;
    // Indicates this network uses a VPN transport.
    TRANSPORT_VPN = 4;
    // Indicates this network uses a Wi-Fi Aware transport.
    TRANSPORT_WIFI_AWARE = 5;
    // Indicates this network uses a LoWPAN transport.
    TRANSPORT_LOWPAN = 6;
}

enum CacheStatus{
    // the cache can't handle that kind of queries.
    // or the answer buffer is too small.
    CS_UNSUPPORTED = 0;
    // the cache doesn't know about this query.
    CS_NOTFOUND = 1;
    // the cache found the answer.
    CS_FOUND = 2;
    // Don't do anything on cache.
    CS_SKIP = 3;
}

message DnsQueryEvent {
    optional NsRcode rcode = 1;

    optional NsType type = 2;

    optional CacheStatus cache_hit = 3;

    optional IpVersion ip_version = 4;

    optional TransportType transport = 5;

    // Number of DNS query retry times
    optional int32 retry_times = 6;

    // Ordinal number of name server.
    optional int32 dns_server_count = 7;

    // Used only by TCP and DOT. True for new connections.
    optional bool connected = 8;

    optional int32 latency_micros = 9;
}

message DnsQueryEvents {
    repeated DnsQueryEvent dns_query_event = 1;
}

/**
 * Logs a DNS lookup operation initiated by the system resolver on behalf of an application
 * invoking native APIs such as getaddrinfo() or Java APIs such as Network#getAllByName().
 *
 * The NetworkDnsEventReported message represents the entire lookup operation, which may
 * result one or more queries to the recursive DNS resolvers. Those are individually logged
 * in DnsQueryEvents to enable computing error rates and network latency and timeouts
 * broken up by query type, transport, network interface, etc.
 */
message NetworkDnsEventReported {
    optional EventType event_type = 1;

    optional ReturnCode return_code = 2;

    // The latency in microseconds of the entire DNS lookup operation.
    optional int32 latency_micros = 3;

    // Only valid for event_type = EVENT_GETADDRINFO.
    optional int32 hints_ai_flags = 4;

    // Flags passed to android_res_nsend() defined in multinetwork.h
    // Only valid for event_type = EVENT_RESNSEND.
    optional int32 res_nsend_flags = 5;

    optional Transport network_type = 6;

    // The DNS over TLS mode on a specific netId.
    optional PrivateDnsModes private_dns_modes = 7;

    // Additional pass-through fields opaque to statsd.
    // The DNS resolver Mainline module can add new fields here without requiring an OS update.
    optional DnsQueryEvents dns_query_events = 8;
}
 No newline at end of file