Skip to content

Commit 9b9249a

Browse files
ohmayrparthea
andauthored
feat: add debug log when creating client (#2265)
Co-authored-by: Anthonios Partheniou <partheniou@google.com>
1 parent 96f1810 commit 9b9249a

File tree

18 files changed

+363
-0
lines changed

18 files changed

+363
-0
lines changed

packages/gapic-generator/gapic/schema/metadata.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ def proto_package(self) -> str:
173173
"""Return the proto package for this type."""
174174
return '.'.join(self.package)
175175

176+
@property
177+
def proto_package_versioned(self) -> str:
178+
"""Return the versioned proto package for this type."""
179+
return ".".join(self.convert_to_versioned_package())
180+
176181
def convert_to_versioned_package(self) -> Tuple[str, ...]:
177182
# We need to change the import statement to use an
178183
# underscore between the module and the version. For example,

packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/async_client.py.j2

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{% import "%namespace/%name_%version/%sub/services/%service/_client_macros.j2" as macros %}
55
{% import "%namespace/%name_%version/%sub/services/%service/_shared_macros.j2" as shared_macros %}
66

7+
import logging as std_logging
78
from collections import OrderedDict
89
import re
910
from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, {% if service.any_server_streaming %}AsyncIterable, Awaitable, {% endif %}{% if service.any_client_streaming %}AsyncIterator, {% endif %}Sequence, Tuple, Type, Union
@@ -52,6 +53,13 @@ from .transports.base import {{ service.name }}Transport, DEFAULT_CLIENT_INFO
5253
from .transports.grpc_asyncio import {{ service.grpc_asyncio_transport_name }}
5354
from .client import {{ service.client_name }}
5455

56+
try: # pragma: NO COVER
57+
from google.api_core import client_logging # type: ignore
58+
CLIENT_LOGGING_SUPPORTED = True
59+
except ImportError:
60+
CLIENT_LOGGING_SUPPORTED = False
61+
62+
_LOGGER = std_logging.getLogger(__name__)
5563

5664
{# TODO(yon-mg): handle rest transport async client interaction #}
5765
class {{ service.async_client_name }}:
@@ -243,6 +251,17 @@ class {{ service.async_client_name }}:
243251

244252
)
245253

254+
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(std_logging.DEBUG): # pragma: NO COVER
255+
_LOGGER.debug(
256+
"Created client `{{ service.meta.address.proto_package_versioned }}.{{ service.async_client_name }}`.",
257+
extra = {
258+
"serviceName": "{{ service.meta.address.proto }}",
259+
"universeDomain": getattr(self._client._transport._credentials, "universe_domain", ""),
260+
"credentialType": f"{type(self._client._transport._credentials).__module__}.{type(self._client._transport._credentials).__qualname__}",
261+
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
262+
},
263+
)
264+
246265
{% for method in service.methods.values() %}
247266
{% with method_name = method.safe_name|snake_case + "_unary" if method.operation_service else method.safe_name|snake_case %}
248267
{%+ if not method.server_streaming %}async {% endif %}def {{ method_name }}(self,

packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/client.py.j2

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ from collections import OrderedDict
1010
{% if service.any_extended_operations_methods %}
1111
import functools
1212
{% endif %}
13+
import logging as std_logging
1314
import os
1415
import re
1516
from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, {% if service.any_server_streaming %}Iterable, {% endif %}{% if service.any_client_streaming %}Iterator, {% endif %}Sequence, Tuple, Type, Union, cast
@@ -39,6 +40,14 @@ try:
3940
except AttributeError: # pragma: NO COVER
4041
OptionalRetry = Union[retries.Retry, object, None] # type: ignore
4142

43+
try: # pragma: NO COVER
44+
from google.api_core import client_logging # type: ignore
45+
CLIENT_LOGGING_SUPPORTED = True
46+
except ImportError:
47+
CLIENT_LOGGING_SUPPORTED = False
48+
49+
_LOGGER = std_logging.getLogger(__name__)
50+
4251
{% filter sort_lines %}
4352
{% for method in service.methods.values() %}
4453
{% for ref_type in method.flat_ref_types %}
@@ -510,6 +519,10 @@ class {{ service.client_name }}(metaclass={{ service.client_name }}Meta):
510519
# Initialize the universe domain validation.
511520
self._is_universe_domain_valid = False
512521

522+
if CLIENT_LOGGING_SUPPORTED: # pragma: NO COVER
523+
# Setup logging.
524+
client_logging.initialize_logging()
525+
513526
api_key_value = getattr(self._client_options, "api_key", None)
514527
if api_key_value and credentials:
515528
raise ValueError("client_options.api_key and credentials are mutually exclusive")
@@ -596,6 +609,18 @@ class {{ service.client_name }}(metaclass={{ service.client_name }}Meta):
596609
always_use_jwt_access=True,
597610
api_audience=self._client_options.api_audience,
598611
)
612+
613+
if "async" not in str(self._transport):
614+
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(std_logging.DEBUG): # pragma: NO COVER
615+
_LOGGER.debug(
616+
"Created client `{{ service.meta.address.proto_package_versioned }}.{{ service.client_name }}`.",
617+
extra = {
618+
"serviceName": "{{ service.meta.address.proto }}",
619+
"universeDomain": getattr(self._transport._credentials, "universe_domain", ""),
620+
"credentialType": f"{type(self._transport._credentials).__module__}.{type(self._transport._credentials).__qualname__}",
621+
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
622+
},
623+
)
599624

600625

601626
{% for method in service.methods.values() %}

packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/async_client.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16+
import logging as std_logging
1617
from collections import OrderedDict
1718
import re
1819
from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union
@@ -46,6 +47,13 @@
4647
from .transports.grpc_asyncio import AssetServiceGrpcAsyncIOTransport
4748
from .client import AssetServiceClient
4849

50+
try: # pragma: NO COVER
51+
from google.api_core import client_logging # type: ignore
52+
CLIENT_LOGGING_SUPPORTED = True
53+
except ImportError:
54+
CLIENT_LOGGING_SUPPORTED = False
55+
56+
_LOGGER = std_logging.getLogger(__name__)
4957

5058
class AssetServiceAsyncClient:
5159
"""Asset service definition."""
@@ -247,6 +255,17 @@ def __init__(self, *,
247255

248256
)
249257

258+
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(std_logging.DEBUG): # pragma: NO COVER
259+
_LOGGER.debug(
260+
"Created client `google.cloud.asset_v1.AssetServiceAsyncClient`.",
261+
extra = {
262+
"serviceName": "google.cloud.asset.v1.AssetService",
263+
"universeDomain": getattr(self._client._transport._credentials, "universe_domain", ""),
264+
"credentialType": f"{type(self._client._transport._credentials).__module__}.{type(self._client._transport._credentials).__qualname__}",
265+
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
266+
},
267+
)
268+
250269
async def export_assets(self,
251270
request: Optional[Union[asset_service.ExportAssetsRequest, dict]] = None,
252271
*,

packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/client.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# limitations under the License.
1515
#
1616
from collections import OrderedDict
17+
import logging as std_logging
1718
import os
1819
import re
1920
from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union, cast
@@ -36,6 +37,14 @@
3637
except AttributeError: # pragma: NO COVER
3738
OptionalRetry = Union[retries.Retry, object, None] # type: ignore
3839

40+
try: # pragma: NO COVER
41+
from google.api_core import client_logging # type: ignore
42+
CLIENT_LOGGING_SUPPORTED = True
43+
except ImportError:
44+
CLIENT_LOGGING_SUPPORTED = False
45+
46+
_LOGGER = std_logging.getLogger(__name__)
47+
3948
from google.api_core import operation # type: ignore
4049
from google.api_core import operation_async # type: ignore
4150
from google.cloud.asset_v1.services.asset_service import pagers
@@ -566,6 +575,10 @@ def __init__(self, *,
566575
# Initialize the universe domain validation.
567576
self._is_universe_domain_valid = False
568577

578+
if CLIENT_LOGGING_SUPPORTED: # pragma: NO COVER
579+
# Setup logging.
580+
client_logging.initialize_logging()
581+
569582
api_key_value = getattr(self._client_options, "api_key", None)
570583
if api_key_value and credentials:
571584
raise ValueError("client_options.api_key and credentials are mutually exclusive")
@@ -618,6 +631,18 @@ def __init__(self, *,
618631
api_audience=self._client_options.api_audience,
619632
)
620633

634+
if "async" not in str(self._transport):
635+
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(std_logging.DEBUG): # pragma: NO COVER
636+
_LOGGER.debug(
637+
"Created client `google.cloud.asset_v1.AssetServiceClient`.",
638+
extra = {
639+
"serviceName": "google.cloud.asset.v1.AssetService",
640+
"universeDomain": getattr(self._transport._credentials, "universe_domain", ""),
641+
"credentialType": f"{type(self._transport._credentials).__module__}.{type(self._transport._credentials).__qualname__}",
642+
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
643+
},
644+
)
645+
621646
def export_assets(self,
622647
request: Optional[Union[asset_service.ExportAssetsRequest, dict]] = None,
623648
*,

packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/async_client.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16+
import logging as std_logging
1617
from collections import OrderedDict
1718
import re
1819
from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union
@@ -39,6 +40,13 @@
3940
from .transports.grpc_asyncio import IAMCredentialsGrpcAsyncIOTransport
4041
from .client import IAMCredentialsClient
4142

43+
try: # pragma: NO COVER
44+
from google.api_core import client_logging # type: ignore
45+
CLIENT_LOGGING_SUPPORTED = True
46+
except ImportError:
47+
CLIENT_LOGGING_SUPPORTED = False
48+
49+
_LOGGER = std_logging.getLogger(__name__)
4250

4351
class IAMCredentialsAsyncClient:
4452
"""A service account is a special type of Google account that
@@ -238,6 +246,17 @@ def __init__(self, *,
238246

239247
)
240248

249+
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(std_logging.DEBUG): # pragma: NO COVER
250+
_LOGGER.debug(
251+
"Created client `google.iam.credentials_v1.IAMCredentialsAsyncClient`.",
252+
extra = {
253+
"serviceName": "google.iam.credentials.v1.IAMCredentials",
254+
"universeDomain": getattr(self._client._transport._credentials, "universe_domain", ""),
255+
"credentialType": f"{type(self._client._transport._credentials).__module__}.{type(self._client._transport._credentials).__qualname__}",
256+
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
257+
},
258+
)
259+
241260
async def generate_access_token(self,
242261
request: Optional[Union[common.GenerateAccessTokenRequest, dict]] = None,
243262
*,

packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/client.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# limitations under the License.
1515
#
1616
from collections import OrderedDict
17+
import logging as std_logging
1718
import os
1819
import re
1920
from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union, cast
@@ -36,6 +37,14 @@
3637
except AttributeError: # pragma: NO COVER
3738
OptionalRetry = Union[retries.Retry, object, None] # type: ignore
3839

40+
try: # pragma: NO COVER
41+
from google.api_core import client_logging # type: ignore
42+
CLIENT_LOGGING_SUPPORTED = True
43+
except ImportError:
44+
CLIENT_LOGGING_SUPPORTED = False
45+
46+
_LOGGER = std_logging.getLogger(__name__)
47+
3948
from google.iam.credentials_v1.types import common
4049
from google.protobuf import duration_pb2 # type: ignore
4150
from google.protobuf import timestamp_pb2 # type: ignore
@@ -503,6 +512,10 @@ def __init__(self, *,
503512
# Initialize the universe domain validation.
504513
self._is_universe_domain_valid = False
505514

515+
if CLIENT_LOGGING_SUPPORTED: # pragma: NO COVER
516+
# Setup logging.
517+
client_logging.initialize_logging()
518+
506519
api_key_value = getattr(self._client_options, "api_key", None)
507520
if api_key_value and credentials:
508521
raise ValueError("client_options.api_key and credentials are mutually exclusive")
@@ -555,6 +568,18 @@ def __init__(self, *,
555568
api_audience=self._client_options.api_audience,
556569
)
557570

571+
if "async" not in str(self._transport):
572+
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(std_logging.DEBUG): # pragma: NO COVER
573+
_LOGGER.debug(
574+
"Created client `google.iam.credentials_v1.IAMCredentialsClient`.",
575+
extra = {
576+
"serviceName": "google.iam.credentials.v1.IAMCredentials",
577+
"universeDomain": getattr(self._transport._credentials, "universe_domain", ""),
578+
"credentialType": f"{type(self._transport._credentials).__module__}.{type(self._transport._credentials).__qualname__}",
579+
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
580+
},
581+
)
582+
558583
def generate_access_token(self,
559584
request: Optional[Union[common.GenerateAccessTokenRequest, dict]] = None,
560585
*,

packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/async_client.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16+
import logging as std_logging
1617
from collections import OrderedDict
1718
import re
1819
from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union
@@ -55,6 +56,13 @@
5556
from .transports.grpc_asyncio import EventarcGrpcAsyncIOTransport
5657
from .client import EventarcClient
5758

59+
try: # pragma: NO COVER
60+
from google.api_core import client_logging # type: ignore
61+
CLIENT_LOGGING_SUPPORTED = True
62+
except ImportError:
63+
CLIENT_LOGGING_SUPPORTED = False
64+
65+
_LOGGER = std_logging.getLogger(__name__)
5866

5967
class EventarcAsyncClient:
6068
"""Eventarc allows users to subscribe to various events that are
@@ -265,6 +273,17 @@ def __init__(self, *,
265273

266274
)
267275

276+
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(std_logging.DEBUG): # pragma: NO COVER
277+
_LOGGER.debug(
278+
"Created client `google.cloud.eventarc_v1.EventarcAsyncClient`.",
279+
extra = {
280+
"serviceName": "google.cloud.eventarc.v1.Eventarc",
281+
"universeDomain": getattr(self._client._transport._credentials, "universe_domain", ""),
282+
"credentialType": f"{type(self._client._transport._credentials).__module__}.{type(self._client._transport._credentials).__qualname__}",
283+
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
284+
},
285+
)
286+
268287
async def get_trigger(self,
269288
request: Optional[Union[eventarc.GetTriggerRequest, dict]] = None,
270289
*,

packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/client.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# limitations under the License.
1515
#
1616
from collections import OrderedDict
17+
import logging as std_logging
1718
import os
1819
import re
1920
from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union, cast
@@ -36,6 +37,14 @@
3637
except AttributeError: # pragma: NO COVER
3738
OptionalRetry = Union[retries.Retry, object, None] # type: ignore
3839

40+
try: # pragma: NO COVER
41+
from google.api_core import client_logging # type: ignore
42+
CLIENT_LOGGING_SUPPORTED = True
43+
except ImportError:
44+
CLIENT_LOGGING_SUPPORTED = False
45+
46+
_LOGGER = std_logging.getLogger(__name__)
47+
3948
from google.api_core import operation # type: ignore
4049
from google.api_core import operation_async # type: ignore
4150
from google.cloud.eventarc_v1.services.eventarc import pagers
@@ -611,6 +620,10 @@ def __init__(self, *,
611620
# Initialize the universe domain validation.
612621
self._is_universe_domain_valid = False
613622

623+
if CLIENT_LOGGING_SUPPORTED: # pragma: NO COVER
624+
# Setup logging.
625+
client_logging.initialize_logging()
626+
614627
api_key_value = getattr(self._client_options, "api_key", None)
615628
if api_key_value and credentials:
616629
raise ValueError("client_options.api_key and credentials are mutually exclusive")
@@ -663,6 +676,18 @@ def __init__(self, *,
663676
api_audience=self._client_options.api_audience,
664677
)
665678

679+
if "async" not in str(self._transport):
680+
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(std_logging.DEBUG): # pragma: NO COVER
681+
_LOGGER.debug(
682+
"Created client `google.cloud.eventarc_v1.EventarcClient`.",
683+
extra = {
684+
"serviceName": "google.cloud.eventarc.v1.Eventarc",
685+
"universeDomain": getattr(self._transport._credentials, "universe_domain", ""),
686+
"credentialType": f"{type(self._transport._credentials).__module__}.{type(self._transport._credentials).__qualname__}",
687+
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
688+
},
689+
)
690+
666691
def get_trigger(self,
667692
request: Optional[Union[eventarc.GetTriggerRequest, dict]] = None,
668693
*,

0 commit comments

Comments
 (0)