Skip to content
This repository has been archived by the owner on Apr 3, 2024. It is now read-only.

Commit

Permalink
feat!: Remove support for deprecated Cloud Debugger API. (#1144)
Browse files Browse the repository at this point in the history
After this change, all agents will use the firebase backend.
  • Loading branch information
mctavish committed Jun 5, 2023
1 parent c292200 commit 7ed8fb2
Show file tree
Hide file tree
Showing 13 changed files with 2,610 additions and 3,284 deletions.
78 changes: 27 additions & 51 deletions src/agent/debuglet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import * as metadata from 'gcp-metadata';
import * as path from 'path';
import * as util from 'util';

import {Debug, PackageInfo} from '../client/stackdriver/debug';
import {StatusMessage} from '../client/stackdriver/status-message';
import {CanaryMode, Debuggee, DebuggeeProperties} from '../debuggee';
import * as stackdriver from '../types/stackdriver';
Expand All @@ -35,7 +34,6 @@ import {
ResolvedDebugAgentConfig,
} from './config';
import {Controller} from './controller';
import {OnePlatformController} from './oneplatform-controller';
import * as scanner from './io/scanner';
import * as SourceMapper from './io/sourcemapper';
import * as utils from './util/utils';
Expand Down Expand Up @@ -79,6 +77,11 @@ export enum Platforms {
DEFAULT = 'default',
}

export interface PackageInfo {
name: string;
version: string;
}

/**
* Formats a breakpoint object prefixed with a provided message as a string
* intended for logging.
Expand Down Expand Up @@ -185,7 +188,7 @@ export interface FindFilesResult {
}

export class Debuglet extends EventEmitter {
private debug: Debug;
private packageInfo: PackageInfo;
private v8debug: DebugApi | null;
private started: boolean;
private running: boolean;
Expand Down Expand Up @@ -216,7 +219,7 @@ export class Debuglet extends EventEmitter {
activeBreakpointMap: {[key: string]: stackdriver.Breakpoint};

/**
* @param {Debug} debug - A Debug instance.
* @param {PackageInfo} packageInfo - Information about the agent package.
* @param {object=} config - The option parameters for the Debuglet.
* @event 'started' once the startup tasks are completed. Only called once.
* @event 'stopped' if the agent stops due to a fatal error after starting.
Expand All @@ -227,14 +230,14 @@ export class Debuglet extends EventEmitter {
* called multiple times.
* @constructor
*/
constructor(debug: Debug, config: DebugAgentConfig) {
constructor(packageInfo: PackageInfo, config: DebugAgentConfig) {
super();

/** @private {object} */
this.config = Debuglet.normalizeConfig_(config);

/** @private {Debug} */
this.debug = debug;
/** @private {PackageInfo} */
this.packageInfo = packageInfo;

/**
* @private {object} V8 Debug API. This can be null if the Node.js version
Expand All @@ -257,7 +260,7 @@ export class Debuglet extends EventEmitter {
/** @private */
this.logger = consoleLogLevel({
stderr: true,
prefix: this.debug.packageInfo.name,
prefix: this.packageInfo.name,
level: Debuglet.logLevelToName(this.config.logLevel),
});

Expand Down Expand Up @@ -431,37 +434,20 @@ export class Debuglet extends EventEmitter {
}

let project: string;
if (this.config.useFirebase) {
try {
const firebaseDb = await FirebaseController.initialize({
keyPath: this.config.firebaseKeyPath,
databaseUrl: this.config.firebaseDbUrl,
projectId: this.config.projectId,
});
this.controller = new FirebaseController(firebaseDb);
project = (this.controller as FirebaseController).getProjectId();
} catch (err) {
this.logger.error(
'Unable to connect to Firebase: ' + (err as Error).message
);
this.emit('initError', err);
return;
}
} else {
try {
project = await this.debug.authClient.getProjectId();
} catch (err) {
this.logger.error(
'The project ID could not be determined: ' + (err as Error).message
);
this.emit('initError', err);
return;
}
this.controller = new OnePlatformController(
this.debug,
this.config,
this.logger
try {
const firebaseDb = await FirebaseController.initialize({
keyPath: this.config.firebaseKeyPath,
databaseUrl: this.config.firebaseDbUrl,
projectId: this.config.projectId,
});
this.controller = new FirebaseController(firebaseDb);
project = (this.controller as FirebaseController).getProjectId();
} catch (err) {
this.logger.error(
'Unable to connect to Firebase: ' + (err as Error).message
);
this.emit('initError', err);
return;
}

if (
Expand Down Expand Up @@ -518,7 +504,7 @@ export class Debuglet extends EventEmitter {
this.config.serviceContext,
sourceContext,
onGCP,
this.debug.packageInfo,
this.packageInfo,
platform,
this.config.description,
/*errorMessage=*/ undefined,
Expand Down Expand Up @@ -861,7 +847,7 @@ export class Debuglet extends EventEmitter {
// New breakpoint
this.addBreakpoint_(breakpoint, err => {
if (err) {
this.completeBreakpoint_(breakpoint, false);
this.completeBreakpoint_(breakpoint);
}
});

Expand Down Expand Up @@ -1011,10 +997,7 @@ export class Debuglet extends EventEmitter {
* @param {Breakpoint} breakpoint
* @private
*/
completeBreakpoint_(
breakpoint: stackdriver.Breakpoint,
deleteFromV8 = true
): void {
completeBreakpoint_(breakpoint: stackdriver.Breakpoint): void {
assert(this.controller);

this.logger.info('\tupdating breakpoint data on server', breakpoint.id);
Expand All @@ -1027,13 +1010,6 @@ export class Debuglet extends EventEmitter {
this.logger.error('Unable to complete breakpoint on server', err);
return;
}
// The Firebase controller will remove the breakpoint during the update
// by removing it from the database.
if (!this.config.useFirebase) {
// TODO: Address the case when `breakpoint.id` is `undefined`.
this.completedBreakpointMap[breakpoint.id as string] = true;
this.removeBreakpoint_(breakpoint, deleteFromV8);
}
}
);
}
Expand Down
5 changes: 3 additions & 2 deletions src/agent/firebase-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,9 @@ export class FirebaseController implements Controller {
credential = firebase.credential.cert(serviceAccount);
} else {
if (!projectId) {
// Try grabbing it from the GCE metadata server.
if (await gcpMetadata.isAvailable()) {
if (process.env.GCLOUD_PROJECT) {
projectId = process.env.GCLOUD_PROJECT;
} else if (await gcpMetadata.isAvailable()) {
projectId = await gcpMetadata.project('project-id');
}
}
Expand Down

0 comments on commit 7ed8fb2

Please sign in to comment.