in sdk/monitor/monitor-opentelemetry-exporter/src/utils/spanUtils.ts [178:288]
function createDependencyData(span: ReadableSpan): RemoteDependencyData {
const remoteDependencyData: RemoteDependencyData = {
name: span.name, // Default
id: `${span.spanContext().spanId}`,
success: span.status?.code !== SpanStatusCode.ERROR,
resultCode: "0",
type: "Dependency",
duration: msToTimeSpan(hrTimeToMilliseconds(span.duration)),
version: 2,
};
if (span.kind === SpanKind.PRODUCER) {
remoteDependencyData.type = DependencyTypes.QueueMessage;
}
if (span.kind === SpanKind.INTERNAL && span.parentSpanId) {
remoteDependencyData.type = DependencyTypes.InProc;
}
const httpMethod = getHttpMethod(span.attributes);
const dbSystem = span.attributes[SEMATTRS_DB_SYSTEM];
const rpcSystem = span.attributes[SEMATTRS_RPC_SYSTEM];
// HTTP Dependency
if (httpMethod) {
const httpUrl = getHttpUrl(span.attributes);
if (httpUrl) {
try {
const dependencyUrl = new URL(String(httpUrl));
remoteDependencyData.name = `${httpMethod} ${dependencyUrl.pathname}`;
} catch {
/* no-op */
}
}
remoteDependencyData.type = DependencyTypes.Http;
remoteDependencyData.data = getUrl(span.attributes);
const httpStatusCode = getHttpStatusCode(span.attributes);
if (httpStatusCode) {
remoteDependencyData.resultCode = String(httpStatusCode);
}
let target = getDependencyTarget(span.attributes);
if (target) {
try {
// Remove default port
const portRegex = new RegExp(/(https?)(:\/\/.*)(:\d+)(\S*)/);
const res = portRegex.exec(target);
if (res !== null) {
const protocol = res[1];
const port = res[3];
if (
(protocol === "https" && port === ":443") ||
(protocol === "http" && port === ":80")
) {
// Drop port
target = res[1] + res[2] + res[4];
}
}
} catch {
/* no-op */
}
remoteDependencyData.target = `${target}`;
}
}
// DB Dependency
else if (dbSystem) {
// TODO: Remove special logic when Azure UX supports OpenTelemetry dbSystem
if (String(dbSystem) === DBSYSTEMVALUES_MYSQL) {
remoteDependencyData.type = "mysql";
} else if (String(dbSystem) === DBSYSTEMVALUES_POSTGRESQL) {
remoteDependencyData.type = "postgresql";
} else if (String(dbSystem) === DBSYSTEMVALUES_MONGODB) {
remoteDependencyData.type = "mongodb";
} else if (String(dbSystem) === DBSYSTEMVALUES_REDIS) {
remoteDependencyData.type = "redis";
} else if (isSqlDB(String(dbSystem))) {
remoteDependencyData.type = "SQL";
} else {
remoteDependencyData.type = String(dbSystem);
}
const dbStatement = span.attributes[SEMATTRS_DB_STATEMENT];
const dbOperation = span.attributes[SEMATTRS_DB_OPERATION];
if (dbStatement) {
remoteDependencyData.data = String(dbStatement);
} else if (dbOperation) {
remoteDependencyData.data = String(dbOperation);
}
const target = getDependencyTarget(span.attributes);
const dbName = span.attributes[SEMATTRS_DB_NAME];
if (target) {
remoteDependencyData.target = dbName ? `${target}|${dbName}` : `${target}`;
} else {
remoteDependencyData.target = dbName ? `${dbName}` : `${dbSystem}`;
}
}
// grpc Dependency
else if (rpcSystem) {
if (rpcSystem === DependencyTypes.Wcf) {
remoteDependencyData.type = DependencyTypes.Wcf;
} else {
remoteDependencyData.type = DependencyTypes.Grpc;
}
const grpcStatusCode = span.attributes[SEMATTRS_RPC_GRPC_STATUS_CODE];
if (grpcStatusCode) {
remoteDependencyData.resultCode = String(grpcStatusCode);
}
const target = getDependencyTarget(span.attributes);
if (target) {
remoteDependencyData.target = `${target}`;
} else if (rpcSystem) {
remoteDependencyData.target = String(rpcSystem);
}
}
return remoteDependencyData;
}