Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion extensions/common/context.cc
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ bool extractPeerMetadataFromUpstreamMetadata(
std::vector<absl::string_view> parts = absl::StrSplit(endpoint_labels, ';');
// workload label should semicolon separated four parts string:
// workload_name;namespace;canonical_service;canonical_revision;cluster_id.
if (parts.size() < 4) {
if (parts.size() < 5) {
return false;
}

Expand Down
40 changes: 26 additions & 14 deletions extensions/common/metadata_object.cc
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ std::string_view toStdStringView(absl::string_view view) {
} // namespace

flatbuffers::DetachedBuffer convertWorkloadMetadataToFlatNode(
const Istio::Common::WorkloadMetadataObject& obj) {
const WorkloadMetadataObject& obj) {
flatbuffers::FlatBufferBuilder fbb;

flatbuffers::Offset<flatbuffers::String> name, cluster, namespace_,
Expand All @@ -202,22 +202,22 @@ flatbuffers::DetachedBuffer convertWorkloadMetadataToFlatNode(
workload_name = fbb.CreateString(toStdStringView(obj.workload_name_));

switch (obj.workload_type_) {
case Istio::Common::WorkloadType::Deployment:
case WorkloadType::Deployment:
owner = fbb.CreateString(absl::StrCat(OwnerPrefix, obj.namespace_name_,
"/", DeploymentSuffix, "s/",
obj.workload_name_));
break;
case Istio::Common::WorkloadType::Job:
case WorkloadType::Job:
owner =
fbb.CreateString(absl::StrCat(OwnerPrefix, obj.namespace_name_, "/",
JobSuffix, "s/", obj.workload_name_));
break;
case Istio::Common::WorkloadType::CronJob:
case WorkloadType::CronJob:
owner = fbb.CreateString(absl::StrCat(OwnerPrefix, obj.namespace_name_,
"/", CronJobSuffix, "s/",
obj.workload_name_));
break;
case Istio::Common::WorkloadType::Pod:
case WorkloadType::Pod:
owner =
fbb.CreateString(absl::StrCat(OwnerPrefix, obj.namespace_name_, "/",
PodSuffix, "s/", obj.workload_name_));
Expand Down Expand Up @@ -250,7 +250,7 @@ flatbuffers::DetachedBuffer convertWorkloadMetadataToFlatNode(
return fbb.Release();
}

Istio::Common::WorkloadMetadataObject convertFlatNodeToWorkloadMetadata(
WorkloadMetadataObject convertFlatNodeToWorkloadMetadata(
const Wasm::Common::FlatNode& node) {
const absl::string_view instance = toAbslStringView(node.name());
const absl::string_view cluster = toAbslStringView(node.cluster_id());
Expand Down Expand Up @@ -282,7 +282,7 @@ Istio::Common::WorkloadMetadataObject convertFlatNodeToWorkloadMetadata(
app_version = toAbslStringView(version);
}

Istio::Common::WorkloadType workload_type = Istio::Common::WorkloadType::Pod;
WorkloadType workload_type = WorkloadType::Pod;
// Strip "s/workload_name" and check for workload type.
absl::string_view owner = toAbslStringView(node.owner());
if (owner.size() > workload.size() + 2) {
Expand All @@ -293,16 +293,16 @@ Istio::Common::WorkloadMetadataObject convertFlatNodeToWorkloadMetadata(
if (it != ALL_WORKLOAD_TOKENS.end()) {
switch (it->second) {
case WorkloadType::Deployment:
workload_type = Istio::Common::WorkloadType::Deployment;
workload_type = WorkloadType::Deployment;
break;
case WorkloadType::CronJob:
workload_type = Istio::Common::WorkloadType::CronJob;
workload_type = WorkloadType::CronJob;
break;
case WorkloadType::Job:
workload_type = Istio::Common::WorkloadType::Job;
workload_type = WorkloadType::Job;
break;
case WorkloadType::Pod:
workload_type = Istio::Common::WorkloadType::Pod;
workload_type = WorkloadType::Pod;
break;
default:
break;
Expand All @@ -311,9 +311,21 @@ Istio::Common::WorkloadMetadataObject convertFlatNodeToWorkloadMetadata(
}
}

return Istio::Common::WorkloadMetadataObject(
instance, cluster, namespace_name, workload, canonical_name,
canonical_revision, app_name, app_version, workload_type);
return WorkloadMetadataObject(instance, cluster, namespace_name, workload,
canonical_name, canonical_revision, app_name,
app_version, workload_type);
}

absl::optional<WorkloadMetadataObject> convertEndpointMetadata(
const std::string& endpoint_encoding) {
std::vector<absl::string_view> parts = absl::StrSplit(endpoint_encoding, ';');
if (parts.size() < 5) {
return {};
}
// TODO: we cannot determine workload type from the encoding.
return absl::make_optional<WorkloadMetadataObject>(
"", parts[4], parts[1], parts[0], parts[2], parts[3], "", "",
WorkloadType::Pod);
}

} // namespace Common
Expand Down
12 changes: 10 additions & 2 deletions extensions/common/metadata_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,19 @@ struct WorkloadMetadataObject : public Envoy::StreamInfo::FilterState::Object,

// Convert metadata object to flatbuffer.
flatbuffers::DetachedBuffer convertWorkloadMetadataToFlatNode(
const Istio::Common::WorkloadMetadataObject& obj);
const WorkloadMetadataObject& obj);

// Convert flatbuffer to metadata object.
Istio::Common::WorkloadMetadataObject convertFlatNodeToWorkloadMetadata(
WorkloadMetadataObject convertFlatNodeToWorkloadMetadata(
const Wasm::Common::FlatNode& node);

// Convert endpoint metadata string to a metadata object.
// Telemetry metadata is compressed into a semicolon separated string:
// workload-name;namespace;canonical-service-name;canonical-service-revision;cluster-id.
// Telemetry metadata is stored as a string under "istio", "workload" field
// path.
absl::optional<WorkloadMetadataObject> convertEndpointMetadata(
const std::string& endpoint_encoding);

} // namespace Common
} // namespace Istio
13 changes: 13 additions & 0 deletions extensions/common/metadata_object_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -177,5 +177,18 @@ TEST(WorkloadMetadataObjectTest, ConvertFromFlatNode) {
EXPECT_EQ(obj.baggage(), "k8s.pod.name=");
}

TEST(WorkloadMetadataObjectTest, ConvertFromEndpointMetadata) {
EXPECT_EQ(absl::nullopt, convertEndpointMetadata(""));
EXPECT_EQ(absl::nullopt, convertEndpointMetadata("a;b"));
EXPECT_EQ(absl::nullopt, convertEndpointMetadata("a;;;b"));
EXPECT_EQ(absl::nullopt, convertEndpointMetadata("a;b;c;d"));
auto obj =
convertEndpointMetadata("foo-pod;default;foo-service;v1;my-cluster");
ASSERT_TRUE(obj.has_value());
EXPECT_EQ(obj->baggage(),
"k8s.pod.name=foo-pod,k8s.cluster.name=my-cluster,k8s.namespace."
"name=default,service.name=foo-service,service.version=v1");
}

} // namespace Common
} // namespace Istio
2 changes: 2 additions & 0 deletions source/extensions/filters/http/istio_stats/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ envoy_cc_extension(
"//extensions/common:metadata_object_lib",
"//extensions/stats:config_cc_proto",
"//source/extensions/common:utils_lib",
"@com_google_cel_cpp//eval/public:builtin_func_registrar",
"@com_google_cel_cpp//eval/public:cel_expr_builder_factory",
"@com_google_cel_cpp//parser",
"@envoy//envoy/registry",
"@envoy//envoy/server:filter_config_interface",
Expand Down
Loading