Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/google/cloud/logging_v2/handlers/_monitored_resources.py: 43%

83 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2023-12-08 06:45 +0000

1# Copyright 2021 Google LLC 

2# 

3# Licensed under the Apache License, Version 2.0 (the "License"); 

4# you may not use this file except in compliance with the License. 

5# You may obtain a copy of the License at 

6# 

7# http://www.apache.org/licenses/LICENSE-2.0 

8# 

9# Unless required by applicable law or agreed to in writing, software 

10# distributed under the License is distributed on an "AS IS" BASIS, 

11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

12# See the License for the specific language governing permissions and 

13# limitations under the License. 

14 

15import os 

16 

17from google.cloud.logging_v2.resource import Resource 

18from google.cloud.logging_v2._helpers import retrieve_metadata_server 

19 

20_GAE_SERVICE_ENV = "GAE_SERVICE" 

21_GAE_VERSION_ENV = "GAE_VERSION" 

22_GAE_INSTANCE_ENV = "GAE_INSTANCE" 

23_GAE_ENV_VARS = [_GAE_SERVICE_ENV, _GAE_VERSION_ENV, _GAE_INSTANCE_ENV] 

24"""Environment variables set in App Engine environment.""" 

25 

26_CLOUD_RUN_SERVICE_ID = "K_SERVICE" 

27_CLOUD_RUN_REVISION_ID = "K_REVISION" 

28_CLOUD_RUN_CONFIGURATION_ID = "K_CONFIGURATION" 

29_CLOUD_RUN_SERVICE_ENV_VARS = [ 

30 _CLOUD_RUN_SERVICE_ID, 

31 _CLOUD_RUN_REVISION_ID, 

32 _CLOUD_RUN_CONFIGURATION_ID, 

33] 

34_CLOUD_RUN_JOB_ID = "CLOUD_RUN_JOB" 

35_CLOUD_RUN_EXECUTION_ID = "CLOUD_RUN_EXECUTION" 

36_CLOUD_RUN_TASK_INDEX = "CLOUD_RUN_TASK_INDEX" 

37_CLOUD_RUN_TASK_ATTEMPT = "CLOUD_RUN_TASK_ATTEMPT" 

38_CLOUD_RUN_JOB_ENV_VARS = [ 

39 _CLOUD_RUN_JOB_ID, 

40 _CLOUD_RUN_EXECUTION_ID, 

41 _CLOUD_RUN_TASK_INDEX, 

42 _CLOUD_RUN_TASK_ATTEMPT, 

43] 

44"""Environment variables set in Cloud Run environment.""" 

45 

46_FUNCTION_TARGET = "FUNCTION_TARGET" 

47_FUNCTION_SIGNATURE = "FUNCTION_SIGNATURE_TYPE" 

48_FUNCTION_NAME = "FUNCTION_NAME" 

49_FUNCTION_REGION = "FUNCTION_REGION" 

50_FUNCTION_ENTRY = "ENTRY_POINT" 

51_FUNCTION_ENV_VARS = [_FUNCTION_TARGET, _FUNCTION_SIGNATURE, _CLOUD_RUN_SERVICE_ID] 

52_LEGACY_FUNCTION_ENV_VARS = [_FUNCTION_NAME, _FUNCTION_REGION, _FUNCTION_ENTRY] 

53"""Environment variables set in Cloud Functions environments.""" 

54 

55 

56_REGION_ID = "instance/region" 

57_ZONE_ID = "instance/zone" 

58_GCE_INSTANCE_ID = "instance/id" 

59"""Attribute in metadata server for compute region and instance.""" 

60 

61_GKE_CLUSTER_NAME = "instance/attributes/cluster-name" 

62"""Attribute in metadata server when in GKE environment.""" 

63 

64_PROJECT_NAME = "project/project-id" 

65"""Attribute in metadata server when in GKE environment.""" 

66 

67 

68def _create_functions_resource(): 

69 """Create a standardized Cloud Functions resource. 

70 Returns: 

71 google.cloud.logging.Resource 

72 """ 

73 project = retrieve_metadata_server(_PROJECT_NAME) 

74 region = retrieve_metadata_server(_REGION_ID) 

75 if _FUNCTION_NAME in os.environ: 

76 function_name = os.environ.get(_FUNCTION_NAME) 

77 elif _CLOUD_RUN_SERVICE_ID in os.environ: 

78 function_name = os.environ.get(_CLOUD_RUN_SERVICE_ID) 

79 else: 

80 function_name = "" 

81 resource = Resource( 

82 type="cloud_function", 

83 labels={ 

84 "project_id": project if project else "", 

85 "function_name": function_name if function_name else "", 

86 "region": region.split("/")[-1] if region else "", 

87 }, 

88 ) 

89 return resource 

90 

91 

92def _create_kubernetes_resource(): 

93 """Create a standardized Kubernetes resource. 

94 Returns: 

95 google.cloud.logging.Resource 

96 """ 

97 zone = retrieve_metadata_server(_ZONE_ID) 

98 cluster_name = retrieve_metadata_server(_GKE_CLUSTER_NAME) 

99 project = retrieve_metadata_server(_PROJECT_NAME) 

100 

101 resource = Resource( 

102 type="k8s_container", 

103 labels={ 

104 "project_id": project if project else "", 

105 "location": zone if zone else "", 

106 "cluster_name": cluster_name if cluster_name else "", 

107 }, 

108 ) 

109 return resource 

110 

111 

112def _create_compute_resource(): 

113 """Create a standardized Compute Engine resource. 

114 Returns: 

115 google.cloud.logging.Resource 

116 """ 

117 instance = retrieve_metadata_server(_GCE_INSTANCE_ID) 

118 zone = retrieve_metadata_server(_ZONE_ID) 

119 project = retrieve_metadata_server(_PROJECT_NAME) 

120 resource = Resource( 

121 type="gce_instance", 

122 labels={ 

123 "project_id": project if project else "", 

124 "instance_id": instance if instance else "", 

125 "zone": zone if zone else "", 

126 }, 

127 ) 

128 return resource 

129 

130 

131def _create_cloud_run_service_resource(): 

132 """Create a standardized Cloud Run service resource. 

133 Returns: 

134 google.cloud.logging.Resource 

135 """ 

136 region = retrieve_metadata_server(_REGION_ID) 

137 project = retrieve_metadata_server(_PROJECT_NAME) 

138 resource = Resource( 

139 type="cloud_run_revision", 

140 labels={ 

141 "project_id": project if project else "", 

142 "service_name": os.environ.get(_CLOUD_RUN_SERVICE_ID, ""), 

143 "revision_name": os.environ.get(_CLOUD_RUN_REVISION_ID, ""), 

144 "location": region.split("/")[-1] if region else "", 

145 "configuration_name": os.environ.get(_CLOUD_RUN_CONFIGURATION_ID, ""), 

146 }, 

147 ) 

148 return resource 

149 

150 

151def _create_cloud_run_job_resource(): 

152 """Create a standardized Cloud Run job resource. 

153 Returns: 

154 google.cloud.logging.Resource 

155 """ 

156 region = retrieve_metadata_server(_REGION_ID) 

157 project = retrieve_metadata_server(_PROJECT_NAME) 

158 resource = Resource( 

159 type="cloud_run_job", 

160 labels={ 

161 "project_id": project if project else "", 

162 "job_name": os.environ.get(_CLOUD_RUN_JOB_ID, ""), 

163 "location": region.split("/")[-1] if region else "", 

164 }, 

165 ) 

166 return resource 

167 

168 

169def _create_app_engine_resource(): 

170 """Create a standardized App Engine resource. 

171 Returns: 

172 google.cloud.logging.Resource 

173 """ 

174 zone = retrieve_metadata_server(_ZONE_ID) 

175 project = retrieve_metadata_server(_PROJECT_NAME) 

176 resource = Resource( 

177 type="gae_app", 

178 labels={ 

179 "project_id": project if project else "", 

180 "module_id": os.environ.get(_GAE_SERVICE_ENV, ""), 

181 "version_id": os.environ.get(_GAE_VERSION_ENV, ""), 

182 "zone": zone if zone else "", 

183 }, 

184 ) 

185 return resource 

186 

187 

188def _create_global_resource(project): 

189 """Create a global resource. 

190 Args: 

191 project (str): The project ID to pass on to the resource 

192 Returns: 

193 google.cloud.logging.Resource 

194 """ 

195 return Resource(type="global", labels={"project_id": project if project else ""}) 

196 

197 

198def detect_resource(project=""): 

199 """Return the default monitored resource based on the local environment. 

200 If GCP resource not found, defaults to `global`. 

201 

202 Args: 

203 project (str): The project ID to pass on to the resource (if needed) 

204 Returns: 

205 google.cloud.logging.Resource: The default resource based on the environment 

206 """ 

207 gke_cluster_name = retrieve_metadata_server(_GKE_CLUSTER_NAME) 

208 gce_instance_name = retrieve_metadata_server(_GCE_INSTANCE_ID) 

209 

210 if all([env in os.environ for env in _GAE_ENV_VARS]): 

211 # App Engine Flex or Standard 

212 return _create_app_engine_resource() 

213 elif gke_cluster_name is not None: 

214 # Kubernetes Engine 

215 return _create_kubernetes_resource() 

216 elif all([env in os.environ for env in _LEGACY_FUNCTION_ENV_VARS]) or all( 

217 [env in os.environ for env in _FUNCTION_ENV_VARS] 

218 ): 

219 # Cloud Functions 

220 return _create_functions_resource() 

221 elif all([env in os.environ for env in _CLOUD_RUN_SERVICE_ENV_VARS]): 

222 # Cloud Run 

223 return _create_cloud_run_service_resource() 

224 elif all([env in os.environ for env in _CLOUD_RUN_JOB_ENV_VARS]): 

225 # Cloud Run 

226 return _create_cloud_run_job_resource() 

227 elif gce_instance_name is not None: 

228 # Compute Engine 

229 return _create_compute_resource() 

230 else: 

231 # use generic global resource 

232 return _create_global_resource(project)