@@ -1574,6 +1574,168 @@ TEST(ServerLatency, NoServerTiming) {
15741574 {clock->Now (), Status{StatusCode::kOk , " ok" }});
15751575}
15761576
1577+ TEST (ApplicationBlockingLatency, Success) {
1578+ auto mock_histogram = std::make_unique<MockHistogram<double >>();
1579+ EXPECT_CALL (
1580+ *mock_histogram,
1581+ Record (A<double >(), A<opentelemetry::common::KeyValueIterable const &>(),
1582+ A<opentelemetry::context::Context const &>()))
1583+ .WillOnce ([](double value,
1584+ opentelemetry::common::KeyValueIterable const & attributes,
1585+ opentelemetry::context::Context const &) {
1586+ EXPECT_THAT (value, Eq (1.234 ));
1587+ EXPECT_THAT (
1588+ MakeAttributesMap (attributes),
1589+ UnorderedElementsAre (
1590+ Pair (" project_id" , " my-project-id" ),
1591+ Pair (" instance" , " my-instance" ), Pair (" cluster" , " my-cluster" ),
1592+ Pair (" table" , " my-table" ), Pair (" zone" , " my-zone" ),
1593+ Pair (" method" , " my-method" ),
1594+ Pair (" client_name" , " my-client-name" ),
1595+ Pair (" client_uid" , " my-client-uid" ),
1596+ Pair (" app_profile" , " my-app-profile" )));
1597+ });
1598+
1599+ opentelemetry::nostd::shared_ptr<MockMeter> mock_meter =
1600+ std::make_shared<MockMeter>();
1601+ EXPECT_CALL (*mock_meter, CreateDoubleHistogram)
1602+ .WillOnce ([mock = std::move (mock_histogram)](
1603+ opentelemetry::nostd::string_view name,
1604+ opentelemetry::nostd::string_view,
1605+ opentelemetry::nostd::string_view) mutable {
1606+ EXPECT_THAT (name, Eq (" application_latencies" ));
1607+ return std::move (mock);
1608+ });
1609+
1610+ opentelemetry::nostd::shared_ptr<MockMeterProvider> mock_provider =
1611+ std::make_shared<MockMeterProvider>();
1612+ EXPECT_CALL (*mock_provider, GetMeter)
1613+ #if OPENTELEMETRY_ABI_VERSION_NO >= 2
1614+ .WillOnce ([&](opentelemetry::nostd::string_view scope,
1615+ opentelemetry::nostd::string_view scope_version,
1616+ opentelemetry::nostd::string_view,
1617+ opentelemetry::common::KeyValueIterable const *) mutable {
1618+ #else
1619+ .WillOnce ([&](opentelemetry::nostd::string_view scope,
1620+ opentelemetry::nostd::string_view scope_version,
1621+ opentelemetry::nostd::string_view) mutable {
1622+ #endif
1623+ EXPECT_THAT (scope, Eq (" my-instrument-scope" ));
1624+ EXPECT_THAT (scope_version, Eq (" v1" ));
1625+ return mock_meter;
1626+ });
1627+
1628+ ApplicationBlockingLatency application_blocking_latency (" my-instrument-scope" ,
1629+ mock_provider);
1630+ ResourceLabels resource_labels{" my-project-id" , " my-instance" , " my-table" , " " ,
1631+ " " };
1632+ DataLabels data_labels{" my-method" , " my-streaming" , " my-client-name" ,
1633+ " my-client-uid" , " my-app-profile" , " " };
1634+ auto clone = application_blocking_latency.clone (resource_labels, data_labels);
1635+
1636+ grpc::ClientContext client_context;
1637+ SetClusterZone (client_context, " my-cluster" , " my-zone" );
1638+ auto otel_context = opentelemetry::context::RuntimeContext::GetCurrent ();
1639+ auto clock = std::make_shared<FakeSteadyClock>();
1640+
1641+ clock->SetTime (std::chrono::steady_clock::now ());
1642+ clone->ElementDelivery (otel_context, {clock->Now (), true });
1643+ clock->AdvanceTime (std::chrono::microseconds (1234 ));
1644+ clone->ElementRequest (otel_context, {clock->Now ()});
1645+ clone->PostCall (otel_context, client_context, {clock->Now (), Status{}});
1646+ clone->OnDone (otel_context, {clock->Now (), Status{}});
1647+ }
1648+
1649+ TEST (ApplicationBlockingLatency, StreamingData) {
1650+ auto mock_histogram = std::make_unique<MockHistogram<double >>();
1651+ EXPECT_CALL (
1652+ *mock_histogram,
1653+ Record (A<double >(), A<opentelemetry::common::KeyValueIterable const &>(),
1654+ A<opentelemetry::context::Context const &>()))
1655+ .WillOnce ([](double value,
1656+ opentelemetry::common::KeyValueIterable const & attributes,
1657+ opentelemetry::context::Context const &) {
1658+ EXPECT_THAT (value, Eq (1.0 ));
1659+ EXPECT_THAT (
1660+ MakeAttributesMap (attributes),
1661+ UnorderedElementsAre (
1662+ Pair (" project_id" , " my-project-id" ),
1663+ Pair (" instance" , " my-instance" ), Pair (" cluster" , " my-cluster" ),
1664+ Pair (" table" , " my-table" ), Pair (" zone" , " my-zone" ),
1665+ Pair (" method" , " my-method" ),
1666+ Pair (" client_name" , " my-client-name" ),
1667+ Pair (" client_uid" , " my-client-uid" ),
1668+ Pair (" app_profile" , " my-app-profile" )));
1669+ })
1670+ .WillOnce ([](double value,
1671+ opentelemetry::common::KeyValueIterable const & attributes,
1672+ opentelemetry::context::Context const &) {
1673+ EXPECT_THAT (value, Eq (5.0 ));
1674+ EXPECT_THAT (
1675+ MakeAttributesMap (attributes),
1676+ UnorderedElementsAre (
1677+ Pair (" project_id" , " my-project-id" ),
1678+ Pair (" instance" , " my-instance" ), Pair (" cluster" , " my-cluster" ),
1679+ Pair (" table" , " my-table" ), Pair (" zone" , " my-zone" ),
1680+ Pair (" method" , " my-method" ),
1681+ Pair (" client_name" , " my-client-name" ),
1682+ Pair (" client_uid" , " my-client-uid" ),
1683+ Pair (" app_profile" , " my-app-profile" )));
1684+ });
1685+
1686+ opentelemetry::nostd::shared_ptr<MockMeter> mock_meter =
1687+ std::make_shared<MockMeter>();
1688+ EXPECT_CALL (*mock_meter, CreateDoubleHistogram)
1689+ .WillOnce ([mock = std::move (mock_histogram)](
1690+ opentelemetry::nostd::string_view name,
1691+ opentelemetry::nostd::string_view,
1692+ opentelemetry::nostd::string_view) mutable {
1693+ EXPECT_THAT (name, Eq (" application_latencies" ));
1694+ return std::move (mock);
1695+ });
1696+
1697+ opentelemetry::nostd::shared_ptr<MockMeterProvider> mock_provider =
1698+ std::make_shared<MockMeterProvider>();
1699+ EXPECT_CALL (*mock_provider, GetMeter)
1700+ #if OPENTELEMETRY_ABI_VERSION_NO >= 2
1701+ .WillOnce ([&](opentelemetry::nostd::string_view scope,
1702+ opentelemetry::nostd::string_view scope_version,
1703+ opentelemetry::nostd::string_view,
1704+ opentelemetry::common::KeyValueIterable const *) mutable {
1705+ #else
1706+ .WillOnce ([&](opentelemetry::nostd::string_view scope,
1707+ opentelemetry::nostd::string_view scope_version,
1708+ opentelemetry::nostd::string_view) mutable {
1709+ #endif
1710+ EXPECT_THAT (scope, Eq (" my-instrument-scope" ));
1711+ EXPECT_THAT (scope_version, Eq (" v1" ));
1712+ return mock_meter;
1713+ });
1714+
1715+ ApplicationBlockingLatency application_blocking_latency (" my-instrument-scope" ,
1716+ mock_provider);
1717+ ResourceLabels resource_labels{" my-project-id" , " my-instance" , " my-table" , " " ,
1718+ " " };
1719+ DataLabels data_labels{" my-method" , " my-streaming" , " my-client-name" ,
1720+ " my-client-uid" , " my-app-profile" , " " };
1721+ auto clone = application_blocking_latency.clone (resource_labels, data_labels);
1722+
1723+ grpc::ClientContext client_context;
1724+ SetClusterZone (client_context, " my-cluster" , " my-zone" );
1725+ auto otel_context = opentelemetry::context::RuntimeContext::GetCurrent ();
1726+ auto clock = std::make_shared<FakeSteadyClock>();
1727+
1728+ clock->SetTime (std::chrono::steady_clock::now ());
1729+ clone->ElementDelivery (otel_context, {clock->Now (), true });
1730+ clock->AdvanceTime (std::chrono::milliseconds (1 ));
1731+ clone->ElementRequest (otel_context, {clock->Now ()});
1732+ clock->AdvanceTime (std::chrono::milliseconds (10 ));
1733+ clone->ElementDelivery (otel_context, {clock->Now (), true });
1734+ clock->AdvanceTime (std::chrono::milliseconds (5 ));
1735+ clone->ElementRequest (otel_context, {clock->Now ()});
1736+ clone->PostCall (otel_context, client_context, {clock->Now (), Status{}});
1737+ clone->OnDone (otel_context, {clock->Now (), Status{}});
1738+ }
15771739} // namespace
15781740GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
15791741} // namespace bigtable_internal
0 commit comments