Skip to content

Commit c4d64c0

Browse files
[server] fix more revealing BB error logs (#20402)
* [server] fix more revealing BB error logs * MOORe * Introduce `BitbucketHttpError` to redact more effectively * Make it work? * comment fix * 💶
1 parent 8054819 commit c4d64c0

File tree

5 files changed

+54
-16
lines changed

5 files changed

+54
-16
lines changed

components/server/src/bitbucket-server/bitbucket-server-context-parser.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { AbstractContextParser, IContextParser, URLParts } from "../workspace/co
1313
import { URL } from "url";
1414
import { BitbucketServer, BitbucketServerApi } from "./bitbucket-server-api";
1515
import { BitbucketServerTokenHelper } from "./bitbucket-server-token-handler";
16+
import { handleBitbucketError } from "./utils";
1617

1718
const DEFAULT_BRANCH = "master";
1819

@@ -87,8 +88,9 @@ export class BitbucketServerContextParser extends AbstractContextParser implemen
8788

8889
return await this.handleNavigatorContext(ctx, user, repoKind, host, owner, repoName, more);
8990
} catch (e) {
90-
span.addTags({ contextUrl }).log({ error: e });
91-
log.error({ userId: user.id }, "Error parsing Bitbucket context", e);
91+
const error = e instanceof Error ? handleBitbucketError(e) : e;
92+
span.addTags({ contextUrl }).log({ error });
93+
log.error({ userId: user.id }, "Error parsing Bitbucket context", error);
9294
throw e;
9395
} finally {
9496
span.finish();
@@ -270,8 +272,9 @@ export class BitbucketServerContextParser extends AbstractContextParser implemen
270272
repository,
271273
};
272274
} catch (e) {
273-
span.log({ error: e });
274-
log.error({ userId: user.id }, "Error parsing Bitbucket navigator request context", e);
275+
const error = e instanceof Error ? handleBitbucketError(e) : e;
276+
span.log({ error });
277+
log.error({ userId: user.id }, "Error parsing Bitbucket navigator request context", error);
275278
throw e;
276279
} finally {
277280
span.finish();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* Copyright (c) 2024 Gitpod GmbH. All rights reserved.
3+
* Licensed under the GNU Affero General Public License (AGPL).
4+
* See License.AGPL.txt in the project root for license information.
5+
*/
6+
7+
import { RequestOptions } from "bitbucket/src/plugins/register-endpoints/types";
8+
9+
// For some reason we can't import HTTPError from bitbucket/src/error/types. This is only a subset of the actual class
10+
export abstract class HTTPError extends Error {
11+
public request: RequestOptions | undefined;
12+
}
13+
14+
export function handleBitbucketError(err: Error): Error {
15+
if (err.name !== "HTTPError") {
16+
return err;
17+
}
18+
19+
const httpError = err as HTTPError;
20+
if (httpError.request?.headers.authorization) {
21+
httpError.request.headers.authorization = "<redacted>";
22+
}
23+
24+
return httpError;
25+
}

components/server/src/bitbucket/bitbucket-context-parser.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { NotFoundError } from "../errors";
2020
import { AbstractContextParser, IContextParser, IssueContexts } from "../workspace/context-parser";
2121
import { BitbucketApiFactory } from "./bitbucket-api-factory";
2222
import { BitbucketTokenHelper } from "./bitbucket-token-handler";
23+
import { handleBitbucketError } from "../bitbucket-server/utils";
2324

2425
const DEFAULT_BRANCH = "master";
2526

@@ -103,8 +104,9 @@ export class BitbucketContextParser extends AbstractContextParser implements ICo
103104
}
104105
return await this.handleNavigatorContext(ctx, user, host, owner, repoName);
105106
} catch (e) {
106-
span.addTags({ contextUrl }).log({ error: e });
107-
log.error({ userId: user.id }, "Error parsing Bitbucket context", e);
107+
const error = e instanceof Error ? handleBitbucketError(e) : e;
108+
span.addTags({ contextUrl }).log({ error });
109+
log.error({ userId: user.id }, "Error parsing Bitbucket context", error);
108110
throw e;
109111
} finally {
110112
span.finish();
@@ -210,8 +212,9 @@ export class BitbucketContextParser extends AbstractContextParser implements ICo
210212
repository,
211213
} as NavigatorContext;
212214
} catch (e) {
213-
span.log({ error: e });
214-
log.error({ userId: user.id }, "Error parsing Bitbucket navigator request context", e);
215+
const error = e instanceof Error ? handleBitbucketError(e) : e;
216+
span.log({ error });
217+
log.error({ userId: user.id }, "Error parsing Bitbucket navigator request context", error);
215218
throw e;
216219
} finally {
217220
span.finish();
@@ -271,8 +274,9 @@ export class BitbucketContextParser extends AbstractContextParser implements ICo
271274
owner,
272275
};
273276
} catch (e) {
274-
span.log({ error: e });
275-
log.error({ userId: user.id }, "Error parsing Bitbucket pull request context", e);
277+
const error = e instanceof Error ? handleBitbucketError(e) : e;
278+
span.log({ error });
279+
log.error({ userId: user.id }, "Error parsing Bitbucket pull request context", error);
276280
throw e;
277281
} finally {
278282
span.finish();
@@ -303,8 +307,9 @@ export class BitbucketContextParser extends AbstractContextParser implements ICo
303307
localBranch: IssueContexts.toBranchName(user, more.title, more.nr),
304308
};
305309
} catch (e) {
306-
span.log({ error: e });
307-
log.error({ userId: user.id }, "Error parsing Bitbucket issue context", e);
310+
const error = e instanceof Error ? handleBitbucketError(e) : e;
311+
span.log({ error });
312+
log.error({ userId: user.id }, "Error parsing Bitbucket issue context", error);
308313
throw e;
309314
} finally {
310315
span.finish();

components/server/src/bitbucket/bitbucket-file-provider.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { log } from "@gitpod/gitpod-protocol/lib/util/logging";
99
import { inject, injectable } from "inversify";
1010
import { FileProvider, MaybeContent, RevisionNotFoundError } from "../repohost/file-provider";
1111
import { BitbucketApiFactory } from "./bitbucket-api-factory";
12+
import { handleBitbucketError } from "../bitbucket-server/utils";
1213

1314
@injectable()
1415
export class BitbucketFileProvider implements FileProvider {
@@ -47,13 +48,14 @@ export class BitbucketFileProvider implements FileProvider {
4748

4849
return lastCommit;
4950
} catch (err) {
50-
if (err.status && err.status === 404) {
51+
const error = err instanceof Error ? handleBitbucketError(err) : err;
52+
if (error.status && error.status === 404) {
5153
throw new RevisionNotFoundError(
5254
`File ${path} does not exist in repository ${repository.owner}/${repository.name}`,
5355
);
5456
}
5557

56-
log.error({ userId: user.id }, err);
58+
log.error({ userId: user.id }, error);
5759
throw new Error(`Could not fetch ${path} of repository ${repository.owner}/${repository.name}: ${err}`);
5860
}
5961
}
@@ -76,7 +78,8 @@ export class BitbucketFileProvider implements FileProvider {
7678
).data;
7779
return contents as string;
7880
} catch (err) {
79-
log.debug({ userId: user.id }, err);
81+
const error = err instanceof Error ? handleBitbucketError(err) : err;
82+
log.debug({ userId: user.id }, error);
8083
}
8184
}
8285
}

components/server/src/bitbucket/bitbucket-repository-provider.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { RepoURL } from "../repohost/repo-url";
1212
import { RepositoryProvider } from "../repohost/repository-provider";
1313
import { BitbucketApiFactory } from "./bitbucket-api-factory";
1414
import asyncBatch from "async-batch";
15+
import { handleBitbucketError } from "../bitbucket-server/utils";
1516

1617
@injectable()
1718
export class BitbucketRepositoryProvider implements RepositoryProvider {
@@ -124,7 +125,8 @@ export class BitbucketRepositoryProvider implements RepositoryProvider {
124125
async hasReadAccess(user: User, owner: string, repo: string): Promise<boolean> {
125126
const api = await this.apiFactory.create(user);
126127
const result = await api.repositories.get({ workspace: owner, repo_slug: repo }).catch((e) => {
127-
console.warn({ userId: user.id }, "hasReadAccess error", { owner, repo, status: e.status });
128+
const error = e instanceof Error ? handleBitbucketError(e) : e;
129+
console.warn({ userId: user.id }, "hasReadAccess error", error, { owner, repo });
128130
return null;
129131
});
130132

0 commit comments

Comments
 (0)