diff --git a/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java b/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java
index c461809..290d201 100644
--- a/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java
+++ b/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java
@@ -20,6 +20,7 @@
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.metrics.DailykeepaliveInfoReported;
 import com.android.metrics.DurationForNumOfKeepalive;
 import com.android.metrics.DurationPerNumOfKeepalive;
 
@@ -159,11 +160,9 @@
     }
 
     /**
-     * Builds and returns DurationPerNumOfKeepalive proto
-     *
-     * <p>TODO(b/273451360): Write DailykeepaliveInfoReported metrics to statsd
+     * Builds and returns DailykeepaliveInfoReported proto.
      */
-    public DurationPerNumOfKeepalive buildKeepaliveMetrics() {
+    public DailykeepaliveInfoReported buildKeepaliveMetrics() {
         final long timeNow = mDependencies.getUptimeMillis();
         updateDurationsPerNumOfKeepalive(timeNow);
 
@@ -175,7 +174,13 @@
                         durationPerNumOfKeepalive.addDurationForNumOfKeepalive(
                                 durationForNumOfKeepalive));
 
-        return durationPerNumOfKeepalive.build();
+        final DailykeepaliveInfoReported.Builder dailyKeepaliveInfoReported =
+                DailykeepaliveInfoReported.newBuilder();
+
+        // TODO(b/273451360): fill all the other values and write to ConnectivityStatsLog.
+        dailyKeepaliveInfoReported.setDurationPerNumOfKeepalive(durationPerNumOfKeepalive);
+
+        return dailyKeepaliveInfoReported.build();
     }
 
     /** Resets the stored metrics but maintains the state of keepalives */
diff --git a/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java b/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java
index 8837ba1..d262255 100644
--- a/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java
+++ b/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java
@@ -17,12 +17,15 @@
 package com.android.server.connectivity;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.doReturn;
 
 import android.os.Build;
 
 import androidx.test.filters.SmallTest;
 
+import com.android.metrics.DailykeepaliveInfoReported;
 import com.android.metrics.DurationForNumOfKeepalive;
 import com.android.metrics.DurationPerNumOfKeepalive;
 import com.android.testutils.DevSdkIgnoreRule;
@@ -38,6 +41,7 @@
 @SmallTest
 @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
 public class KeepaliveStatsTrackerTest {
+    private static final int TEST_UID = 1234;
 
     private KeepaliveStatsTracker mKeepaliveStatsTracker;
     @Mock KeepaliveStatsTracker.Dependencies mDependencies;
@@ -87,18 +91,38 @@
         }
     }
 
+    private void assertDailyKeepaliveInfoReported(
+            DailykeepaliveInfoReported dailyKeepaliveInfoReported,
+            int[] expectRegisteredDurations,
+            int[] expectActiveDurations) {
+        // TODO(b/273451360) Assert these values when they are filled.
+        assertFalse(dailyKeepaliveInfoReported.hasKeepaliveLifetimePerCarrier());
+        assertFalse(dailyKeepaliveInfoReported.hasKeepaliveRequests());
+        assertFalse(dailyKeepaliveInfoReported.hasAutomaticKeepaliveRequests());
+        assertFalse(dailyKeepaliveInfoReported.hasDistinctUserCount());
+        assertTrue(dailyKeepaliveInfoReported.getUidList().isEmpty());
+
+        final DurationPerNumOfKeepalive resultDurations =
+                dailyKeepaliveInfoReported.getDurationPerNumOfKeepalive();
+        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+    }
+
     @Test
     public void testNoKeepalive() {
         final int writeTime = 5000;
 
         setUptimeMillis(writeTime);
-        final DurationPerNumOfKeepalive resultDurations =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         // Expect that the durations are all in numOfKeepalive = 0.
         final int[] expectRegisteredDurations = new int[] {writeTime};
         final int[] expectActiveDurations = new int[] {writeTime};
-        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported,
+                expectRegisteredDurations,
+                expectActiveDurations);
     }
 
     /*
@@ -117,14 +141,17 @@
         mKeepaliveStatsTracker.onStartKeepalive();
 
         setUptimeMillis(writeTime);
-        final DurationPerNumOfKeepalive resultDurations =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         // The keepalive is never stopped, expect the duration for numberOfKeepalive of 1 to range
         // from startTime to writeTime.
         final int[] expectRegisteredDurations = new int[] {startTime, writeTime - startTime};
         final int[] expectActiveDurations = new int[] {startTime, writeTime - startTime};
-        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported,
+                expectRegisteredDurations,
+                expectActiveDurations);
     }
 
     /*
@@ -147,7 +174,7 @@
         mKeepaliveStatsTracker.onPauseKeepalive();
 
         setUptimeMillis(writeTime);
-        final DurationPerNumOfKeepalive resultDurations =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         // The keepalive is paused but not stopped, expect the registered duration for
@@ -156,7 +183,10 @@
         final int[] expectRegisteredDurations = new int[] {startTime, writeTime - startTime};
         final int[] expectActiveDurations =
                 new int[] {startTime + (writeTime - pauseTime), pauseTime - startTime};
-        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported,
+                expectRegisteredDurations,
+                expectActiveDurations);
     }
 
     /*
@@ -183,7 +213,7 @@
         mKeepaliveStatsTracker.onResumeKeepalive();
 
         setUptimeMillis(writeTime);
-        final DurationPerNumOfKeepalive resultDurations =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         // The keepalive is paused and resumed but not stopped, expect the registered duration for
@@ -195,7 +225,10 @@
                     startTime + (resumeTime - pauseTime),
                     (pauseTime - startTime) + (writeTime - resumeTime)
                 };
-        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported,
+                expectRegisteredDurations,
+                expectActiveDurations);
     }
 
     /*
@@ -226,7 +259,7 @@
         mKeepaliveStatsTracker.onStopKeepalive(/* wasActive= */ true);
 
         setUptimeMillis(writeTime);
-        final DurationPerNumOfKeepalive resultDurations =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         // The keepalive is now stopped, expect the registered duration for numberOfKeepalive of 1
@@ -239,7 +272,10 @@
                     startTime + (resumeTime - pauseTime) + (writeTime - stopTime),
                     (pauseTime - startTime) + (stopTime - resumeTime)
                 };
-        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported,
+                expectRegisteredDurations,
+                expectActiveDurations);
     }
 
     /*
@@ -266,7 +302,7 @@
         mKeepaliveStatsTracker.onStopKeepalive(/* wasActive= */ false);
 
         setUptimeMillis(writeTime);
-        final DurationPerNumOfKeepalive resultDurations =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         // The keepalive is stopped while paused, expect the registered duration for
@@ -276,7 +312,10 @@
                 new int[] {startTime + (writeTime - stopTime), stopTime - startTime};
         final int[] expectActiveDurations =
                 new int[] {startTime + (writeTime - pauseTime), (pauseTime - startTime)};
-        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported,
+                expectRegisteredDurations,
+                expectActiveDurations);
     }
 
     /*
@@ -310,7 +349,7 @@
         mKeepaliveStatsTracker.onStopKeepalive(/* wasActive= */ true);
 
         setUptimeMillis(writeTime);
-        final DurationPerNumOfKeepalive resultDurations =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         final int[] expectRegisteredDurations =
@@ -322,7 +361,10 @@
                             + /* sum of (Pause - Resume) */ (700)
                             + (stopTime - pauseResumeTimes[5])
                 };
-        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported,
+                expectRegisteredDurations,
+                expectActiveDurations);
     }
 
     /*
@@ -367,7 +409,7 @@
         mKeepaliveStatsTracker.onStopKeepalive(/* wasActive= */ true);
 
         setUptimeMillis(writeTime);
-        final DurationPerNumOfKeepalive resultDurations =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         // With two keepalives, the number of concurrent keepalives can vary from 0-2 depending on
@@ -380,6 +422,7 @@
                     // 2 registered keepalives between keepalive2 start and keepalive1 stop.
                     stopTime1 - startTime2
                 };
+
         final int[] expectActiveDurations =
                 new int[] {
                     // 0 active keepalives when keepalive1 is paused before keepalive2 starts.
@@ -395,7 +438,10 @@
                     // 2 active keepalives before keepalive2 is paused and before keepalive1 stops.
                     (pauseTime2 - resumeTime1) + (stopTime1 - resumeTime2)
                 };
-        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported,
+                expectRegisteredDurations,
+                expectActiveDurations);
     }
 
     /*
@@ -416,34 +462,43 @@
         mKeepaliveStatsTracker.onStartKeepalive();
 
         setUptimeMillis(writeTime);
-        final DurationPerNumOfKeepalive resultDurations =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         // Same expect as testOneKeepalive_startOnly
         final int[] expectRegisteredDurations = new int[] {startTime, writeTime - startTime};
         final int[] expectActiveDurations = new int[] {startTime, writeTime - startTime};
-        assertDurationMetrics(expectRegisteredDurations, expectActiveDurations, resultDurations);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported,
+                expectRegisteredDurations,
+                expectActiveDurations);
 
         // Reset metrics
         mKeepaliveStatsTracker.resetMetrics();
 
-        final DurationPerNumOfKeepalive resultDurations2 =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported2 =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
         // Expect the stored durations to be 0 but still contain the number of keepalive = 1.
-        assertDurationMetrics(new int[] {0, 0}, new int[] {0, 0}, resultDurations2);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported2,
+                /* expectRegisteredDurations= */ new int[] {0, 0},
+                /* expectActiveDurations= */ new int[] {0, 0});
 
         // Expect that the keepalive is still registered after resetting so it can be stopped.
         setUptimeMillis(stopTime);
         mKeepaliveStatsTracker.onStopKeepalive(/* wasActive= */ true);
 
         setUptimeMillis(writeTime2);
-        final DurationPerNumOfKeepalive resultDurations3 =
+        final DailykeepaliveInfoReported dailyKeepaliveInfoReported3 =
                 mKeepaliveStatsTracker.buildKeepaliveMetrics();
 
         final int[] expectRegisteredDurations2 =
                 new int[] {writeTime2 - stopTime, stopTime - writeTime};
         final int[] expectActiveDurations2 =
                 new int[] {writeTime2 - stopTime, stopTime - writeTime};
-        assertDurationMetrics(expectRegisteredDurations2, expectActiveDurations2, resultDurations3);
+        assertDailyKeepaliveInfoReported(
+                dailyKeepaliveInfoReported3,
+                expectRegisteredDurations2,
+                expectActiveDurations2);
     }
 }
