Skip to content

Commit 64b13a9

Browse files
authored
Event type IDs + event metadata incl. OTel context (#2998)
This PR implements the action items from the following discussion threads: - https://lists.apache.org/thread/yx7pkgczl6k7bt4k4yzqrrq9gn7gqk2p - https://lists.apache.org/thread/rl5cpcft16sn5n00mfkmx9ldn3gsqtfy - https://lists.apache.org/thread/5dpyo0nn2jbnjtkgv0rm1dz8mpt132j9 Summary of changes: - Introduced a `PolarisEventType` enum holding the 150+ event types. - Introduced a `PolarisEventMetadata` interface as suggested by @adnanhemani, exposing: event ID, timestamp, realm ID, principal, request ID, and OTel context. - Introduced a `PolarisEventMetadataFactory` to centralize the logic for gathering the various elements of an event metadata. - Modified `PolarisEvent` to expose 3 new methods: - `PolarisEventType type()` - `PolarisEventMetadata metadata()` - Persistence of OTel context is done in `additional_properties` as suggested by @flyrain. - Added `InMemoryBufferEventListenerIntegrationTest` to verify that all contextual data is properly persisted.
1 parent 5e38579 commit 64b13a9

File tree

41 files changed

+2375
-603
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+2375
-603
lines changed

polaris-core/src/main/java/org/apache/polaris/core/entity/PolarisEvent.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@
2121

2222
import com.fasterxml.jackson.annotation.JsonIgnore;
2323
import com.fasterxml.jackson.core.JsonProcessingException;
24+
import com.fasterxml.jackson.core.type.TypeReference;
2425
import com.fasterxml.jackson.databind.ObjectMapper;
2526
import jakarta.annotation.Nullable;
2627
import java.util.Map;
2728

2829
public class PolarisEvent {
29-
// TODO: Look into using the CDI-managed `ObjectMapper` object
3030
public static final String EMPTY_MAP_STRING = "{}";
3131

3232
// to serialize/deserialize properties
33+
// TODO: Look into using the CDI-managed `ObjectMapper` object
3334
private static final ObjectMapper MAPPER = new ObjectMapper();
3435

3536
// catalog id
@@ -116,6 +117,17 @@ public PolarisEvent(
116117
this.resourceIdentifier = resourceIdentifier;
117118
}
118119

120+
@JsonIgnore
121+
public Map<String, String> getAdditionalPropertiesAsMap() {
122+
String properties = getAdditionalProperties();
123+
try {
124+
return MAPPER.readValue(properties, new TypeReference<>() {});
125+
} catch (JsonProcessingException ex) {
126+
throw new IllegalStateException(
127+
String.format("Failed to deserialize json. properties %s", properties), ex);
128+
}
129+
}
130+
119131
@JsonIgnore
120132
public void setAdditionalProperties(Map<String, String> properties) {
121133
try {

runtime/service/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ dependencies {
116116
}
117117

118118
testImplementation(project(":polaris-api-management-model"))
119+
testImplementation(project(":polaris-relational-jdbc"))
119120

120121
testImplementation(project(":polaris-minio-testcontainer"))
121122

runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisCatalogsEventServiceDelegator.java

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.apache.polaris.core.entity.PolarisPrivilege;
4444
import org.apache.polaris.service.admin.api.PolarisCatalogsApiService;
4545
import org.apache.polaris.service.events.CatalogsServiceEvents;
46+
import org.apache.polaris.service.events.PolarisEventMetadataFactory;
4647
import org.apache.polaris.service.events.listeners.PolarisEventListener;
4748

4849
@Decorator
@@ -51,37 +52,44 @@ public class PolarisCatalogsEventServiceDelegator implements PolarisCatalogsApiS
5152

5253
@Inject @Delegate PolarisCatalogsApiService delegate;
5354
@Inject PolarisEventListener polarisEventListener;
55+
@Inject PolarisEventMetadataFactory eventMetadataFactory;
5456

5557
@Override
5658
public Response createCatalog(
5759
CreateCatalogRequest request, RealmContext realmContext, SecurityContext securityContext) {
5860
polarisEventListener.onBeforeCreateCatalog(
59-
new CatalogsServiceEvents.BeforeCreateCatalogEvent(request.getCatalog().getName()));
61+
new CatalogsServiceEvents.BeforeCreateCatalogEvent(
62+
eventMetadataFactory.create(), request.getCatalog().getName()));
6063
Response resp = delegate.createCatalog(request, realmContext, securityContext);
6164
polarisEventListener.onAfterCreateCatalog(
62-
new CatalogsServiceEvents.AfterCreateCatalogEvent((Catalog) resp.getEntity()));
65+
new CatalogsServiceEvents.AfterCreateCatalogEvent(
66+
eventMetadataFactory.create(), (Catalog) resp.getEntity()));
6367
return resp;
6468
}
6569

6670
@Override
6771
public Response deleteCatalog(
6872
String catalogName, RealmContext realmContext, SecurityContext securityContext) {
6973
polarisEventListener.onBeforeDeleteCatalog(
70-
new CatalogsServiceEvents.BeforeDeleteCatalogEvent(catalogName));
74+
new CatalogsServiceEvents.BeforeDeleteCatalogEvent(
75+
eventMetadataFactory.create(), catalogName));
7176
Response resp = delegate.deleteCatalog(catalogName, realmContext, securityContext);
7277
polarisEventListener.onAfterDeleteCatalog(
73-
new CatalogsServiceEvents.AfterDeleteCatalogEvent(catalogName));
78+
new CatalogsServiceEvents.AfterDeleteCatalogEvent(
79+
eventMetadataFactory.create(), catalogName));
7480
return resp;
7581
}
7682

7783
@Override
7884
public Response getCatalog(
7985
String catalogName, RealmContext realmContext, SecurityContext securityContext) {
8086
polarisEventListener.onBeforeGetCatalog(
81-
new CatalogsServiceEvents.BeforeGetCatalogEvent(catalogName));
87+
new CatalogsServiceEvents.BeforeGetCatalogEvent(
88+
eventMetadataFactory.create(), catalogName));
8289
Response resp = delegate.getCatalog(catalogName, realmContext, securityContext);
8390
polarisEventListener.onAfterGetCatalog(
84-
new CatalogsServiceEvents.AfterGetCatalogEvent((Catalog) resp.getEntity()));
91+
new CatalogsServiceEvents.AfterGetCatalogEvent(
92+
eventMetadataFactory.create(), (Catalog) resp.getEntity()));
8593
return resp;
8694
}
8795

@@ -92,19 +100,23 @@ public Response updateCatalog(
92100
RealmContext realmContext,
93101
SecurityContext securityContext) {
94102
polarisEventListener.onBeforeUpdateCatalog(
95-
new CatalogsServiceEvents.BeforeUpdateCatalogEvent(catalogName, updateRequest));
103+
new CatalogsServiceEvents.BeforeUpdateCatalogEvent(
104+
eventMetadataFactory.create(), catalogName, updateRequest));
96105
Response resp =
97106
delegate.updateCatalog(catalogName, updateRequest, realmContext, securityContext);
98107
polarisEventListener.onAfterUpdateCatalog(
99-
new CatalogsServiceEvents.AfterUpdateCatalogEvent((Catalog) resp.getEntity()));
108+
new CatalogsServiceEvents.AfterUpdateCatalogEvent(
109+
eventMetadataFactory.create(), (Catalog) resp.getEntity()));
100110
return resp;
101111
}
102112

103113
@Override
104114
public Response listCatalogs(RealmContext realmContext, SecurityContext securityContext) {
105-
polarisEventListener.onBeforeListCatalogs(new CatalogsServiceEvents.BeforeListCatalogsEvent());
115+
polarisEventListener.onBeforeListCatalogs(
116+
new CatalogsServiceEvents.BeforeListCatalogsEvent(eventMetadataFactory.create()));
106117
Response resp = delegate.listCatalogs(realmContext, securityContext);
107-
polarisEventListener.onAfterListCatalogs(new CatalogsServiceEvents.AfterListCatalogsEvent());
118+
polarisEventListener.onAfterListCatalogs(
119+
new CatalogsServiceEvents.AfterListCatalogsEvent(eventMetadataFactory.create()));
108120
return resp;
109121
}
110122

@@ -116,11 +128,11 @@ public Response createCatalogRole(
116128
SecurityContext securityContext) {
117129
polarisEventListener.onBeforeCreateCatalogRole(
118130
new CatalogsServiceEvents.BeforeCreateCatalogRoleEvent(
119-
catalogName, request.getCatalogRole().getName()));
131+
eventMetadataFactory.create(), catalogName, request.getCatalogRole().getName()));
120132
Response resp = delegate.createCatalogRole(catalogName, request, realmContext, securityContext);
121133
polarisEventListener.onAfterCreateCatalogRole(
122134
new CatalogsServiceEvents.AfterCreateCatalogRoleEvent(
123-
catalogName, (CatalogRole) resp.getEntity()));
135+
eventMetadataFactory.create(), catalogName, (CatalogRole) resp.getEntity()));
124136
return resp;
125137
}
126138

@@ -131,11 +143,13 @@ public Response deleteCatalogRole(
131143
RealmContext realmContext,
132144
SecurityContext securityContext) {
133145
polarisEventListener.onBeforeDeleteCatalogRole(
134-
new CatalogsServiceEvents.BeforeDeleteCatalogRoleEvent(catalogName, catalogRoleName));
146+
new CatalogsServiceEvents.BeforeDeleteCatalogRoleEvent(
147+
eventMetadataFactory.create(), catalogName, catalogRoleName));
135148
Response resp =
136149
delegate.deleteCatalogRole(catalogName, catalogRoleName, realmContext, securityContext);
137150
polarisEventListener.onAfterDeleteCatalogRole(
138-
new CatalogsServiceEvents.AfterDeleteCatalogRoleEvent(catalogName, catalogRoleName));
151+
new CatalogsServiceEvents.AfterDeleteCatalogRoleEvent(
152+
eventMetadataFactory.create(), catalogName, catalogRoleName));
139153
return resp;
140154
}
141155

@@ -146,12 +160,13 @@ public Response getCatalogRole(
146160
RealmContext realmContext,
147161
SecurityContext securityContext) {
148162
polarisEventListener.onBeforeGetCatalogRole(
149-
new CatalogsServiceEvents.BeforeGetCatalogRoleEvent(catalogName, catalogRoleName));
163+
new CatalogsServiceEvents.BeforeGetCatalogRoleEvent(
164+
eventMetadataFactory.create(), catalogName, catalogRoleName));
150165
Response resp =
151166
delegate.getCatalogRole(catalogName, catalogRoleName, realmContext, securityContext);
152167
polarisEventListener.onAfterGetCatalogRole(
153168
new CatalogsServiceEvents.AfterGetCatalogRoleEvent(
154-
catalogName, (CatalogRole) resp.getEntity()));
169+
eventMetadataFactory.create(), catalogName, (CatalogRole) resp.getEntity()));
155170
return resp;
156171
}
157172

@@ -164,24 +179,26 @@ public Response updateCatalogRole(
164179
SecurityContext securityContext) {
165180
polarisEventListener.onBeforeUpdateCatalogRole(
166181
new CatalogsServiceEvents.BeforeUpdateCatalogRoleEvent(
167-
catalogName, catalogRoleName, updateRequest));
182+
eventMetadataFactory.create(), catalogName, catalogRoleName, updateRequest));
168183
Response resp =
169184
delegate.updateCatalogRole(
170185
catalogName, catalogRoleName, updateRequest, realmContext, securityContext);
171186
polarisEventListener.onAfterUpdateCatalogRole(
172187
new CatalogsServiceEvents.AfterUpdateCatalogRoleEvent(
173-
catalogName, (CatalogRole) resp.getEntity()));
188+
eventMetadataFactory.create(), catalogName, (CatalogRole) resp.getEntity()));
174189
return resp;
175190
}
176191

177192
@Override
178193
public Response listCatalogRoles(
179194
String catalogName, RealmContext realmContext, SecurityContext securityContext) {
180195
polarisEventListener.onAfterListCatalogRoles(
181-
new CatalogsServiceEvents.AfterListCatalogRolesEvent(catalogName));
196+
new CatalogsServiceEvents.AfterListCatalogRolesEvent(
197+
eventMetadataFactory.create(), catalogName));
182198
Response resp = delegate.listCatalogRoles(catalogName, realmContext, securityContext);
183199
polarisEventListener.onBeforeListCatalogRoles(
184-
new CatalogsServiceEvents.BeforeListCatalogRolesEvent(catalogName));
200+
new CatalogsServiceEvents.BeforeListCatalogRolesEvent(
201+
eventMetadataFactory.create(), catalogName));
185202
return resp;
186203
}
187204

@@ -194,13 +211,14 @@ public Response addGrantToCatalogRole(
194211
SecurityContext securityContext) {
195212
polarisEventListener.onBeforeAddGrantToCatalogRole(
196213
new CatalogsServiceEvents.BeforeAddGrantToCatalogRoleEvent(
197-
catalogName, catalogRoleName, grantRequest));
214+
eventMetadataFactory.create(), catalogName, catalogRoleName, grantRequest));
198215
Response resp =
199216
delegate.addGrantToCatalogRole(
200217
catalogName, catalogRoleName, grantRequest, realmContext, securityContext);
201218
GrantResource grantResource = grantRequest.getGrant();
202219
polarisEventListener.onAfterAddGrantToCatalogRole(
203220
new CatalogsServiceEvents.AfterAddGrantToCatalogRoleEvent(
221+
eventMetadataFactory.create(),
204222
catalogName,
205223
catalogRoleName,
206224
getPrivilegeFromGrantResource(grantResource),
@@ -218,13 +236,14 @@ public Response revokeGrantFromCatalogRole(
218236
SecurityContext securityContext) {
219237
polarisEventListener.onBeforeRevokeGrantFromCatalogRole(
220238
new CatalogsServiceEvents.BeforeRevokeGrantFromCatalogRoleEvent(
221-
catalogName, catalogRoleName, grantRequest, cascade));
239+
eventMetadataFactory.create(), catalogName, catalogRoleName, grantRequest, cascade));
222240
Response resp =
223241
delegate.revokeGrantFromCatalogRole(
224242
catalogName, catalogRoleName, cascade, grantRequest, realmContext, securityContext);
225243
GrantResource grantResource = grantRequest.getGrant();
226244
polarisEventListener.onAfterRevokeGrantFromCatalogRole(
227245
new CatalogsServiceEvents.AfterRevokeGrantFromCatalogRoleEvent(
246+
eventMetadataFactory.create(),
228247
catalogName,
229248
catalogRoleName,
230249
getPrivilegeFromGrantResource(grantResource),
@@ -241,13 +260,13 @@ public Response listAssigneePrincipalRolesForCatalogRole(
241260
SecurityContext securityContext) {
242261
polarisEventListener.onBeforeListAssigneePrincipalRolesForCatalogRole(
243262
new CatalogsServiceEvents.BeforeListAssigneePrincipalRolesForCatalogRoleEvent(
244-
catalogName, catalogRoleName));
263+
eventMetadataFactory.create(), catalogName, catalogRoleName));
245264
Response resp =
246265
delegate.listAssigneePrincipalRolesForCatalogRole(
247266
catalogName, catalogRoleName, realmContext, securityContext);
248267
polarisEventListener.onAfterListAssigneePrincipalRolesForCatalogRole(
249268
new CatalogsServiceEvents.AfterListAssigneePrincipalRolesForCatalogRoleEvent(
250-
catalogName, catalogRoleName));
269+
eventMetadataFactory.create(), catalogName, catalogRoleName));
251270
return resp;
252271
}
253272

@@ -259,12 +278,13 @@ public Response listGrantsForCatalogRole(
259278
SecurityContext securityContext) {
260279
polarisEventListener.onBeforeListGrantsForCatalogRole(
261280
new CatalogsServiceEvents.BeforeListGrantsForCatalogRoleEvent(
262-
catalogName, catalogRoleName));
281+
eventMetadataFactory.create(), catalogName, catalogRoleName));
263282
Response resp =
264283
delegate.listGrantsForCatalogRole(
265284
catalogName, catalogRoleName, realmContext, securityContext);
266285
polarisEventListener.onAfterListGrantsForCatalogRole(
267-
new CatalogsServiceEvents.AfterListGrantsForCatalogRoleEvent(catalogName, catalogRoleName));
286+
new CatalogsServiceEvents.AfterListGrantsForCatalogRoleEvent(
287+
eventMetadataFactory.create(), catalogName, catalogRoleName));
268288
return resp;
269289
}
270290

0 commit comments

Comments
 (0)