@@ -26,6 +26,18 @@ import (
2626 "github.com/policy-engine/policy-engine/internal/constants"
2727)
2828
29+ // Constants for analytics metadata
30+ const (
31+ Wso2MetadataPrefix = "x-wso2-"
32+ APIIDKey = Wso2MetadataPrefix + "api-id"
33+ APINameKey = Wso2MetadataPrefix + "api-name"
34+ APIVersionKey = Wso2MetadataPrefix + "api-version"
35+ APITypeKey = Wso2MetadataPrefix + "api-type"
36+ APIContextKey = Wso2MetadataPrefix + "api-context"
37+ OperationPathKey = Wso2MetadataPrefix + "operation-path"
38+ APIKindKey = Wso2MetadataPrefix + "api-kind"
39+ )
40+
2941// buildAnalyticsStruct converts analytics metadata map to structpb.Struct
3042// If execCtx is provided, adds system-level metadata (API name, version, etc.) to analytics_data.metadata
3143func buildAnalyticsStruct (analyticsData map [string ]any , execCtx * PolicyExecutionContext ) (* structpb.Struct , error ) {
@@ -43,31 +55,25 @@ func buildAnalyticsStruct(analyticsData map[string]any, execCtx *PolicyExecution
4355
4456 // Add system-level metadata if context is provided
4557 if execCtx != nil && execCtx .requestContext != nil && execCtx .requestContext .SharedContext != nil {
46- metadata := make (map [string ]interface {})
4758
4859 sharedCtx := execCtx .requestContext .SharedContext
4960 if sharedCtx .APIId != "" {
50- metadata [ "api_id" ] = sharedCtx .APIId
61+ fields [ APIIDKey ] = structpb . NewStringValue ( sharedCtx .APIId )
5162 }
5263 if sharedCtx .APIName != "" {
53- metadata [ "api_name" ] = sharedCtx .APIName
64+ fields [ APINameKey ] = structpb . NewStringValue ( sharedCtx .APIName )
5465 }
5566 if sharedCtx .APIVersion != "" {
56- metadata [ "api_version" ] = sharedCtx .APIVersion
67+ fields [ APIVersionKey ] = structpb . NewStringValue ( sharedCtx .APIVersion )
5768 }
5869 if sharedCtx .APIContext != "" {
59- metadata [ "api_context" ] = sharedCtx .APIContext
70+ fields [ APIContextKey ] = structpb . NewStringValue ( sharedCtx .APIContext )
6071 }
6172 if sharedCtx .OperationPath != "" {
62- metadata [ "operation_path" ] = sharedCtx .OperationPath
73+ fields [ OperationPathKey ] = structpb . NewStringValue ( sharedCtx .OperationPath )
6374 }
64-
65- if len (metadata ) > 0 {
66- metadataVal , err := structpb .NewValue (metadata )
67- if err != nil {
68- return nil , fmt .Errorf ("failed to convert system metadata: %w" , err )
69- }
70- fields ["metadata" ] = metadataVal
75+ if sharedCtx .APIKind != "" {
76+ fields [APIKindKey ] = structpb .NewStringValue (sharedCtx .APIKind )
7177 }
7278 }
7379
@@ -99,16 +105,19 @@ func buildDynamicMetadata(analyticsStruct *structpb.Struct) *structpb.Struct {
99105func extractMetadataFromRouteMetadata (routeMeta RouteMetadata ) map [string ]interface {} {
100106 metadata := make (map [string ]interface {})
101107 if routeMeta .APIName != "" {
102- metadata ["api_name" ] = routeMeta .APIName
108+ metadata [APINameKey ] = routeMeta .APIName
103109 }
104110 if routeMeta .APIVersion != "" {
105- metadata ["api_version" ] = routeMeta .APIVersion
111+ metadata [APIVersionKey ] = routeMeta .APIVersion
106112 }
107113 if routeMeta .Context != "" {
108- metadata ["api_context" ] = routeMeta .Context
114+ metadata [APIContextKey ] = routeMeta .Context
109115 }
110116 if routeMeta .OperationPath != "" {
111- metadata ["operation_path" ] = routeMeta .OperationPath
117+ metadata [OperationPathKey ] = routeMeta .OperationPath
118+ }
119+ if routeMeta .APIKind != "" {
120+ metadata [APIKindKey ] = routeMeta .APIKind
112121 }
113122 return metadata
114123}
0 commit comments