来自文件的 C# Stackdriver Trace 凭据
Posted
技术标签:
【中文标题】来自文件的 C# Stackdriver Trace 凭据【英文标题】:C# Stackdriver Trace credentials from file 【发布时间】:2020-01-13 00:10:56 【问题描述】:我使用带有 C#(dotnet 核心)的 Google 云 Stackdriver Trace API 并根据此article 工作。
我已经添加了所有需要的代码并想在本地尝试(在我的开发机器上)。由于我不是从 GCP 云运行,因此我创建了一个具有所需权限的新服务帐户。谷歌在文章中说:
GCP 客户端库使用应用程序默认凭据 (ADC) 来查找 您的应用程序的凭据。您通过以下方式提供这些凭据 设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量:
export GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key
现在我的代码在达到这一点时失败了:
services.AddGoogleExceptionLogging(options =>
options.ProjectId = Configuration["Stackdriver:ProjectId"];
options.ServiceName = Configuration["Stackdriver:ServiceName"];
options.Version = Configuration["Stackdriver:Version"];
);
带有消息:
System.InvalidOperationException: '读取凭证文件时出错 位置 C:******.json: 找不到文件。 请检查环境的值 变量 GOOGLE_APPLICATION_CREDENTIALS'
出于多种原因,我不想使用名为GOOGLE_APPLICATION_CREDENTIALS
的环境变量。相反,我正在寻找一种方法来为其提供实际文件路径,而不使用环境变量。
我该怎么做?
【问题讨论】:
【参考方案1】:你正在使用的命令
出口 GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key
在Linux中使用,但您的帖子指定的错误
.... 从位置 C:******.json 读取凭证文件时出错:可能 找不到文件.....
在这种情况下,您似乎使用的是 windows,您需要使用命令“SET”来分配值,位于“Setting the environment variable”段落中。
您还可以在代码中传递服务帐户密钥,在这种情况下,您需要安装Cloud Storage client library,您可以在段落“Passing the path to the service account key in code” 中查看示例,您可以在其中看到此 C# 代码,并且您有指向带有示例代码的 GitHub。
// Some APIs, like Storage, accept a credential in their Create()
// method.
public object AuthExplicit(string projectId, string jsonPath)
// Explicitly use service account credentials by specifying
// the private key file.
var credential = GoogleCredential.FromFile(jsonPath);
var storage = StorageClient.Create(credential);
// Make an authenticated API request.
var buckets = storage.ListBuckets(projectId);
foreach (var bucket in buckets)
Console.WriteLine(bucket.Name);
return null;
// Other APIs, like Language, accept a channel in their Create()
// method.
public object AuthExplicit(string projectId, string jsonPath)
var credential = GoogleCredential.FromFile(jsonPath)
.CreateScoped(LanguageServiceClient.DefaultScopes);
var channel = new Grpc.Core.Channel(
LanguageServiceClient.DefaultEndpoint.ToString(),
credential.ToChannelCredentials());
var client = LanguageServiceClient.Create(channel);
AnalyzeSentiment(client);
return 0;
【讨论】:
您附加的代码是基于StorageClient的,在我提到的示例中-没有地方使用它(StorageClient
)
是一个使用示例,您可以查看这一行 "var credential = GoogleCredential.FromFile(jsonPath)" ,在该代码所在的同一页面中您可以查看一个按钮“在 GitHub 上查看”您可以在其中观察一个名为 AuthSample 的完整代码。
我在项目的其他地方熟悉该代码。但是在这里,我没有使用credential
变量的地方。使用 Storage 对象时,您有重载使用它 (StorageClient.Create(cred)
)【参考方案2】:
由于您不想使用环境变量,您是否尝试过使用 gcloud SDK 进行身份验证?
正如here 解释的那样:
如果在本地运行以进行开发/测试,您可以使用 Google Cloud SDK 进行身份验证。如果您还没有下载 SDK,然后在命令行中运行以下命令登录:
gcloud auth 应用程序-默认登录
否则,唯一的其他方法就是在源代码中指定路径。
您应该可以使用here 提供的示例来做到这一点。调整它以满足您的特定需求。
此示例展示了如何使用从 JSON 文件加载的凭据创建客户端:
using Google.Cloud.ErrorReporting.V1Beta1;
using Google.Apis.Auth.OAuth2;
using Grpc.Auth;
using Grpc.Core;
...
GoogleCredential cred = GoogleCredential.FromFile("/path/to/credentials.json");
Channel channel = new Channel(
ReportErrorsServiceClient.DefaultEndpoint.Host, ReportErrorsServiceClient.DefaultEndpoint.Port, cred.ToChannelCredentials());
ReportErrorsServiceClient client = ReportErrorsServiceClient.Create(channel);
...
// Shutdown the channel when it is no longer required.
channel.ShutdownAsync().Wait();
【讨论】:
以上是关于来自文件的 C# Stackdriver Trace 凭据的主要内容,如果未能解决你的问题,请参考以下文章
来自 Python 应用的 Opencensus Stackdriver 跟踪未出现在 GCP 的跟踪列表中
如何将本地 Kubernetes 日志发送到 Stackdriver
将浏览器 JavaScript 错误发送到 Stackdriver 错误报告