Skip to content

Commit b36a43a

Browse files
vertex-sdk-botcopybara-github
authored andcommitted
feat: Add request/response logging to PSC endpoints
PiperOrigin-RevId: 735461836
1 parent 5fb8cf1 commit b36a43a

File tree

2 files changed

+104
-51
lines changed

2 files changed

+104
-51
lines changed

google/cloud/aiplatform/models.py

Lines changed: 71 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3339,6 +3339,9 @@ def create(
33393339
encryption_spec_key_name: Optional[str] = None,
33403340
sync=True,
33413341
private_service_connect_config: Optional[PrivateServiceConnectConfig] = None,
3342+
enable_request_response_logging=False,
3343+
request_response_logging_sampling_rate: Optional[float] = None,
3344+
request_response_logging_bq_destination_table: Optional[str] = None,
33423345
inference_timeout: Optional[int] = None,
33433346
) -> "PrivateEndpoint":
33443347
"""Creates a new PrivateEndpoint.
@@ -3376,64 +3379,68 @@ def create(
33763379
project_allowlist=["test-project"]),
33773380
)
33783381
Args:
3379-
display_name (str):
3380-
Required. The user-defined name of the Endpoint.
3381-
The name can be up to 128 characters long and can be consist
3382-
of any UTF-8 characters.
3383-
project (str):
3384-
Optional. Project to retrieve endpoint from. If not set, project
3385-
set in aiplatform.init will be used.
3386-
location (str):
3387-
Optional. Location to retrieve endpoint from. If not set, location
3388-
set in aiplatform.init will be used.
3389-
network (str):
3390-
Optional. The full name of the Compute Engine network to which
3391-
this Endpoint will be peered. E.g. "projects/123456789123/global/networks/my_vpc".
3392-
Private services access must already be configured for the network.
3393-
If left unspecified, the network set with aiplatform.init will be used.
3394-
Cannot be set together with private_service_connect_config.
3395-
description (str):
3396-
Optional. The description of the Endpoint.
3397-
labels (Dict[str, str]):
3398-
Optional. The labels with user-defined metadata to
3399-
organize your Endpoints.
3400-
Label keys and values can be no longer than 64
3401-
characters (Unicode codepoints), can only
3402-
contain lowercase letters, numeric characters,
3403-
underscores and dashes. International characters
3404-
are allowed.
3405-
See https://goo.gl/xmQnxf for more information
3406-
and examples of labels.
3407-
credentials (auth_credentials.Credentials):
3408-
Optional. Custom credentials to use to upload this model. Overrides
3409-
credentials set in aiplatform.init.
3410-
encryption_spec_key_name (str):
3411-
Optional. The Cloud KMS resource identifier of the customer
3412-
managed encryption key used to protect the model. Has the
3382+
display_name (str): Required. The user-defined name of the Endpoint. The
3383+
name can be up to 128 characters long and can be consist of any UTF-8
3384+
characters.
3385+
project (str): Optional. Project to retrieve endpoint from. If not set,
3386+
project set in aiplatform.init will be used.
3387+
location (str): Optional. Location to retrieve endpoint from. If not
3388+
set, location set in aiplatform.init will be used.
3389+
network (str): Optional. The full name of the Compute Engine network to
3390+
which this Endpoint will be peered. E.g.
3391+
"projects/123456789123/global/networks/my_vpc". Private services
3392+
access must already be configured for the network. If left
3393+
unspecified, the network set with aiplatform.init will be used. Cannot
3394+
be set together with private_service_connect_config.
3395+
description (str): Optional. The description of the Endpoint.
3396+
labels (Dict[str, str]): Optional. The labels with user-defined metadata
3397+
to organize your Endpoints. Label keys and values can be no longer
3398+
than 64 characters (Unicode codepoints), can only contain lowercase
3399+
letters, numeric characters, underscores and dashes. International
3400+
characters are allowed. See https://goo.gl/xmQnxf for more information
3401+
and examples of labels.
3402+
credentials (auth_credentials.Credentials): Optional. Custom credentials
3403+
to use to upload this model. Overrides credentials set in
3404+
aiplatform.init.
3405+
encryption_spec_key_name (str): Optional. The Cloud KMS resource
3406+
identifier of the customer managed encryption key used to protect the
3407+
model. Has the
34133408
form:
3414-
``projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key``.
3415-
The key needs to be in the same region as where the compute
3416-
resource is created.
3417-
3418-
If set, this Model and all sub-resources of this Model will be secured by this key.
3419-
3420-
Overrides encryption_spec_key_name set in aiplatform.init.
3421-
sync (bool):
3422-
Whether to execute this method synchronously. If False, this method
3423-
will be executed in concurrent Future and any downstream object will
3424-
be immediately returned and synced when the Future has completed.
3425-
private_service_connect_config (aiplatform.PrivateEndpoint.PrivateServiceConnectConfig):
3426-
[Private Service Connect](https://cloud.google.com/vpc/docs/private-service-connect) configuration for the endpoint.
3427-
Cannot be set when network is specified.
3428-
inference_timeout (int):
3429-
Optional. It defines the prediction timeout, in seconds, for online predictions using cloud-based endpoints. This applies to either PSC endpoints, when private_service_connect_config is set, or dedicated endpoints, when dedicated_endpoint_enabled is true.
3409+
``projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key``.
3410+
The key needs to be in the same region as where the compute
3411+
resource is created. If set, this Model and all sub-resources of
3412+
this Model will be secured by this key. Overrides
3413+
encryption_spec_key_name set in aiplatform.init.
3414+
sync (bool): Whether to execute this method synchronously. If False,
3415+
this method will be executed in concurrent Future and any downstream
3416+
object will be immediately returned and synced when the Future has
3417+
completed. private_service_connect_config
3418+
(aiplatform.PrivateEndpoint.PrivateServiceConnectConfig): [Private
3419+
Service
3420+
Connect](https://cloud.google.com/vpc/docs/private-service-connect)
3421+
configuration for the endpoint. Cannot be set when network is
3422+
specified.
3423+
enable_request_response_logging (bool): Optional. Whether to enable
3424+
request & response logging for this endpoint.
3425+
request_response_logging_sampling_rate (float): Optional. The request
3426+
response logging sampling rate. If not set, default is 0.0.
3427+
request_response_logging_bq_destination_table (str): Optional. The
3428+
request response logging bigquery destination. If not set, will create
3429+
a table with name:
3430+
``bq://{project_id}.logging_{endpoint_display_name}_{endpoint_id}.request_response_logging``.
3431+
inference_timeout (int): Optional. It defines the prediction timeout, in
3432+
seconds, for online predictions using cloud-based endpoints. This
3433+
applies to either PSC endpoints, when private_service_connect_config
3434+
is set, or dedicated endpoints, when dedicated_endpoint_enabled is
3435+
true.
34303436
34313437
Returns:
34323438
endpoint (aiplatform.PrivateEndpoint):
34333439
Created endpoint.
34343440
34353441
Raises:
3436-
ValueError: A network must be instantiated when creating a PrivateEndpoint.
3442+
ValueError: A network must be instantiated when creating a
3443+
PrivateEndpoint.
34373444
"""
34383445
api_client = cls._instantiate_client(location=location, credentials=credentials)
34393446

@@ -3463,6 +3470,18 @@ def create(
34633470
private_service_connect_config._gapic_private_service_connect_config
34643471
)
34653472

3473+
predict_request_response_logging_config = None
3474+
if enable_request_response_logging:
3475+
predict_request_response_logging_config = (
3476+
gca_endpoint_compat.PredictRequestResponseLoggingConfig(
3477+
enabled=True,
3478+
sampling_rate=request_response_logging_sampling_rate,
3479+
bigquery_destination=gca_io_compat.BigQueryDestination(
3480+
output_uri=request_response_logging_bq_destination_table
3481+
),
3482+
)
3483+
)
3484+
34663485
client_connection_config = None
34673486
if private_service_connect_config and inference_timeout:
34683487
client_connection_config = gca_endpoint_compat.ClientConnectionConfig(
@@ -3483,6 +3502,7 @@ def create(
34833502
network=network,
34843503
sync=sync,
34853504
private_service_connect_config=config,
3505+
predict_request_response_logging_config=predict_request_response_logging_config,
34863506
client_connection_config=client_connection_config,
34873507
)
34883508

tests/unit/aiplatform/test_endpoints.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3554,6 +3554,39 @@ def test_create_psc_with_timeout(self, create_psc_private_endpoint_mock, sync):
35543554
endpoint_id=None,
35553555
)
35563556

3557+
@pytest.mark.parametrize("sync", [True, False])
3558+
def test_create_with_request_response_logging_on_psc(
3559+
self, create_psc_private_endpoint_mock, sync
3560+
):
3561+
my_endpoint = models.PrivateEndpoint.create(
3562+
display_name=_TEST_DISPLAY_NAME,
3563+
sync=sync,
3564+
private_service_connect_config=models.PrivateEndpoint.PrivateServiceConnectConfig(
3565+
project_allowlist=_TEST_PROJECT_ALLOWLIST
3566+
),
3567+
enable_request_response_logging=True,
3568+
request_response_logging_sampling_rate=_TEST_REQUEST_RESPONSE_LOGGING_SAMPLING_RATE,
3569+
request_response_logging_bq_destination_table=_TEST_REQUEST_RESPONSE_LOGGING_BQ_DEST,
3570+
)
3571+
if not sync:
3572+
my_endpoint.wait()
3573+
3574+
expected_endpoint = gca_endpoint.Endpoint(
3575+
display_name=_TEST_DISPLAY_NAME,
3576+
private_service_connect_config=gca_service_networking.PrivateServiceConnectConfig(
3577+
enable_private_service_connect=True,
3578+
project_allowlist=_TEST_PROJECT_ALLOWLIST,
3579+
),
3580+
predict_request_response_logging_config=_TEST_REQUEST_RESPONSE_LOGGING_CONFIG,
3581+
)
3582+
create_psc_private_endpoint_mock.assert_called_once_with(
3583+
parent=_TEST_PARENT,
3584+
endpoint=expected_endpoint,
3585+
endpoint_id=None,
3586+
metadata=(),
3587+
timeout=None,
3588+
)
3589+
35573590
@pytest.mark.usefixtures("get_psa_private_endpoint_with_model_mock")
35583591
def test_psa_predict(self, predict_private_endpoint_mock):
35593592
test_endpoint = models.PrivateEndpoint(_TEST_ID)

0 commit comments

Comments
 (0)