Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/service-account/util/Token.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ import jwt from "jsonwebtoken";
import { errorMessages } from "../errors/Messages";
import { printLog } from "../../vault-api/utils/logs-helper";
import logs from "../../vault-api/utils/logs";
import { MessageType } from "../../vault-api/utils/common";
import { MessageType, SDK_METRICS_HEADER_KEY } from "../../vault-api/utils/common";
import SkyflowError from '../../vault-api/libs/SkyflowError';
import { generateSDKMetrics } from "../../vault-api/utils/helpers";

export type ResponseToken = { accessToken: string, tokenType: string }
export type ResponseSignedDataTokens = { token: string, signedToken: string }
Expand Down Expand Up @@ -119,7 +120,10 @@ function getToken(credentials, options?: BearerTokenOptions): Promise<ResponseTo
const scopedRoles = options?.roleIDs && getRolesForScopedToken(options.roleIDs)
Axios(`${credentialsObj.tokenURI}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
headers: {
"Content-Type": "application/json",
[SDK_METRICS_HEADER_KEY]: JSON.stringify(generateSDKMetrics()),
},
data: {
grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
assertion: signedJwt,
Expand Down
6 changes: 4 additions & 2 deletions src/vault-api/client/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ import {
} from '../utils/logs-helper';
import {
ContentType,
MessageType
MessageType,
SDK_METRICS_HEADER_KEY
} from '../utils/common';
import axios, { Method } from 'axios';
import { objectToFormData, toLowerKeys } from '../utils/helpers';
import { generateSDKMetrics, objectToFormData, toLowerKeys } from '../utils/helpers';
export interface IClientRequest {
body?: any;
headers?: Record<string, string>;
Expand Down Expand Up @@ -52,6 +53,7 @@ class Client {
request = (request: IClientRequest) => new Promise((resolve, reject) => {
const headerKeys = toLowerKeys(request.headers);
let contentType = headerKeys['content-type']
headerKeys[SDK_METRICS_HEADER_KEY] = JSON.stringify(generateSDKMetrics());
const data = this.convertRequestBody(request.body,contentType)
const headers = this.getHeaders(data,headerKeys)
axios({
Expand Down
4 changes: 3 additions & 1 deletion src/vault-api/utils/common/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,4 +126,6 @@ export interface IUpdateInput{

export interface IUpdateOptions{
tokens: boolean
}
}

export const SDK_METRICS_HEADER_KEY = "sky-metadata";
71 changes: 66 additions & 5 deletions src/vault-api/utils/helpers/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
/*
Copyright (c) 2022 Skyflow, Inc.
*/
import axios from "axios";
import Client, { IClientRequest } from "../../client";
import { ContentType, IConnectionConfig } from "../common";
const qs = require('qs');
const FormData = require('form-data');
import * as sdkDetails from "../../../../package.json";
import { MessageType } from "../common";
import logs from "../logs";
import { parameterizedString, printLog } from "../logs-helper";
const FormData = require("form-data");
const os = require("os");
const process = require("process");

export function fillUrlWithPathAndQueryParams(url:string,
pathParams?:object,
queryParams?:object) {
Expand Down Expand Up @@ -60,3 +63,61 @@ export function objectToFormData(obj: any, form?: FormData, namespace?: string)

return fd;
}


export const generateSDKMetrics = () => {
let sdkNameVersion = "";
let clientDeviceModel = "";
let clientOSDetails = "";
let runtimeDetails = "";
try {
sdkNameVersion = `${sdkDetails.name ? `${sdkDetails.name}@` : ""}${
sdkDetails.version ? sdkDetails.version : ""
}`;
} catch (err) {
printLog(
parameterizedString(logs.infoLogs.UNABLE_TO_GENERATE_SDK_METRIC,"sdkNameVersion")
,MessageType.LOG
);
sdkNameVersion = "";
}

try {
clientDeviceModel = `${process.platform ? `${process.platform} ` : ""} ${
process.arch ? process.arch : ""
}`;
} catch (err) {
printLog(
parameterizedString(logs.infoLogs.UNABLE_TO_GENERATE_SDK_METRIC,"clientDeviceModel")
,MessageType.LOG
);
clientDeviceModel = "";
}

try {
clientOSDetails = `${os.version() ? os.version() : ""}`;
} catch (err) {
printLog(
parameterizedString(logs.infoLogs.UNABLE_TO_GENERATE_SDK_METRIC,"clientOSDetails")
,MessageType.LOG
);
clientOSDetails = "";
}

try {
runtimeDetails = `${process.version ? `Node@${process.version}` : ""}`;
} catch (err) {
printLog(
parameterizedString(logs.infoLogs.UNABLE_TO_GENERATE_SDK_METRIC,"runtimeDetails")
,MessageType.LOG
);
runtimeDetails = "";
}

return {
sdk_name_version: sdkNameVersion,
sdk_client_device_model: clientDeviceModel,
sdk_client_os_details: clientOSDetails,
sdk_runtime_details: runtimeDetails,
};
};
1 change: 1 addition & 0 deletions src/vault-api/utils/logs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const logs = {
GENERATE_SIGNED_DATA_TOKENS_TRIGGERED: "generateSignedDataTokens is triggered",
UPDATE_TRIGGERED: 'Update method triggered.',
UPDATE_REQUEST_RESOLVED:'Update request is resolved.',
UNABLE_TO_GENERATE_SDK_METRIC:'Unable to generate %s1 metric.'

},
errorLogs: {
Expand Down
3 changes: 2 additions & 1 deletion test/vault-api/Client.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
*/
import Client from "../../src/vault-api/client";
import axios from "axios";
import { generateSDKMetrics } from "../../src/vault-api/utils/helpers";

jest.mock("axios", () => {
return {
Expand Down Expand Up @@ -30,7 +31,7 @@ describe("Client Class",()=>{
headers: { "Content-Type": "application/json" },
};
const data = JSON.stringify({ name: "John Doe", age: 30 });
const headers = { "content-type": "application/json" };
const headers = { "content-type": "application/json","sky-metadata":JSON.stringify(generateSDKMetrics()) };
axios.mockImplementation(() =>
Promise.resolve({ data: { message: "Success" } })
);
Expand Down
44 changes: 42 additions & 2 deletions test/vault-api/Util.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,16 @@ import {
import SKYFLOW_ERROR_CODE from "../../src/vault-api/utils/constants";
import { parameterizedString } from "../../src/vault-api/utils/logs-helper";
import SkyflowError from "../../src/vault-api/libs/SkyflowError";
import { fillUrlWithPathAndQueryParams, formatVaultURL, toLowerKeys, objectToFormData } from "../../src/vault-api/utils/helpers";
import { fillUrlWithPathAndQueryParams, formatVaultURL, toLowerKeys, objectToFormData, generateSDKMetrics } from "../../src/vault-api/utils/helpers";
const FormData = require('form-data');

let mockJson = {};
jest.mock('../../package.json',()=>(mockJson));
let mockProcess = {};
jest.mock('process',()=>(mockProcess));
let mockOS= {};
jest.mock('os',()=>(mockOS))

describe("validate upsert options in collect", () => {
it("invalid upsert options type", () => {
try {
Expand Down Expand Up @@ -553,4 +560,37 @@ describe("URL helper its", () => {
const result = objectToFormData(obj);
expect(result).toBeDefined();
});
});
});

describe("test generateSDKMetrics",()=>{

test('should set it empty string when name version are undefined',()=>{
mockJson = {name:undefined,version:null}
const metrics = generateSDKMetrics();
expect(metrics.sdk_name_version).toBe('');
});

test('should set it device model empty string when process is invalid or empty',()=>{
mockProcess = {};
const metrics = generateSDKMetrics();
expect(metrics.sdk_client_device_model).toBe('');
});

test('should set it run time details empty string when process is invalid or empty',()=>{
mockProcess = {};
const metrics = generateSDKMetrics();
expect(metrics.sdk_runtime_details).toBe('');
});

test('should set it os details empty string when process is invalid or empty',()=>{
mockOS = {};
const metrics = generateSDKMetrics();
expect(metrics.sdk_client_os_details).toBe('');
});






});