From aa70fe957d4acf79b019b709d48aa12cfb8e460e Mon Sep 17 00:00:00 2001 From: Peter Paul Kirschner Date: Mon, 27 May 2024 10:26:15 +0200 Subject: [PATCH] Readme an PnPJS --- samples/react-appinsights-usage/README.md | 39 ++++-- .../assets/PNPJSLogger.png | Bin 0 -> 52357 bytes .../assets/sample.json | 112 ++++++++++++++++++ .../react-appinsights-usage/package-lock.json | 21 ++++ samples/react-appinsights-usage/package.json | 1 + .../pnPjsLogger/PnPjsLoggerWebPart.ts | 55 ++++++++- .../pnPjsLogger/components/PnPjsLogger.tsx | 36 ++++-- .../listener/appinsight-loglistener.ts | 22 ++++ 8 files changed, 261 insertions(+), 25 deletions(-) create mode 100644 samples/react-appinsights-usage/assets/PNPJSLogger.png create mode 100644 samples/react-appinsights-usage/assets/sample.json create mode 100644 samples/react-appinsights-usage/src/webparts/pnPjsLogger/listener/appinsight-loglistener.ts diff --git a/samples/react-appinsights-usage/README.md b/samples/react-appinsights-usage/README.md index 283833477..53c6954cb 100644 --- a/samples/react-appinsights-usage/README.md +++ b/samples/react-appinsights-usage/README.md @@ -1,10 +1,23 @@ -# app-insights-spfx-webparts +--- +page_type: sample +products: +- office-sp +languages: +- typescript +extensions: + contentType: samples + technologies: + - SharePoint Framework + platforms: + - react + createdDate: 5/26/2024 12:00:00 AM +--- + +# Application Insights usage ## Summary -Short summary on functionality and used technologies. - -[picture of the solution in action, if possible] +Application Insights provides telemetry data to monitor and improve application performance and user experience, while AB Testing, user flow analysis, and logging help in optimizing and debugging applications by comparing different versions, mapping user paths, and recording significant events. The 3 Sample Webpart demonstrates webpart functionalities to aid developers in integrating customizable components effectively. ## Used SharePoint Framework Version @@ -22,11 +35,10 @@ Short summary on functionality and used technologies. Application Insight Service on Azure Add the connection stirng of this Service to the the variable ```AIConnectionString``` at ```src/EnvProps.ts``` -## Solution -| Solution | Author(s) | -| ----------- | ------------------------------------------------------- | -| folder name | Author details (name, company, twitter alias with link) | +## Contributors + +* [Peter Paul Kirschner](https://github.com/petkir) ## Version history @@ -44,6 +56,8 @@ Add the connection stirng of this Service to the the variable ```AIConnectionStr - Clone this repository - Ensure that you are at the solution folder +- Create or use Existing Azure Application Insights +- Update ```src/EnvProps.ts``` and Set AIConnectionString - in the command-line run: - **npm install** - **gulp serve** @@ -63,8 +77,7 @@ This extension illustrates the following concepts: - Logging - PnP JS Logger - Logging with PnPJS -- Custom Logger - - Logging with PnPJS + # Sample Router WebPart @@ -115,6 +128,10 @@ customEvents ``` ![AB Evaluation](assets/ABEvaluation.png) +# PnPJS Logger WebPart + +![Logoutput with Browser Log Level Filter](assets/PNPJSLogger.png) + > Notice that better pictures and documentation will increase the sample usage and the value you are providing for others. Thanks for your submissions advance. > Share your web part with others through Microsoft 365 Patterns and Practices program to get visibility and exposure. More details on the community, open-source projects and other activities from http://aka.ms/m365pnp. @@ -126,3 +143,5 @@ customEvents - [Use Microsoft Graph in your solution](https://docs.microsoft.com/en-us/sharepoint/dev/spfx/web-parts/get-started/using-microsoft-graph-apis) - [Publish SharePoint Framework applications to the Marketplace](https://docs.microsoft.com/en-us/sharepoint/dev/spfx/publish-to-marketplace-overview) - [Microsoft 365 Patterns and Practices](https://aka.ms/m365pnp) - Guidance, tooling, samples and open-source controls for your Microsoft 365 development +- [PnPJS/Logging](https://pnp.github.io/pnpjs/logging/) +- [Application Insights](https://learn.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview) Application Insights provides many experiences to enhance the performance, reliability, and quality of your applications. \ No newline at end of file diff --git a/samples/react-appinsights-usage/assets/PNPJSLogger.png b/samples/react-appinsights-usage/assets/PNPJSLogger.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba2c445ed35733da6c04e1c2cb60dbf2b5517f1 GIT binary patch literal 52357 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.0.0" } }, + "node_modules/@pnp/logging": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@pnp/logging/-/logging-4.0.1.tgz", + "integrity": "sha512-+HVb3EFvSuEis2Wn7kHVhReEyFsB8Vtb2PfRWGcHQiCXGuje9y2oJb8HLxpV5+IdS2qoqpktrZa6ADf8+EkOVQ==", + "dependencies": { + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/patrick-rodgers/" + } + }, + "node_modules/@pnp/logging/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@pnpm/crypto.base32-hash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@pnpm/crypto.base32-hash/-/crypto.base32-hash-2.0.0.tgz", diff --git a/samples/react-appinsights-usage/package.json b/samples/react-appinsights-usage/package.json index 6179099b9..8b16e6942 100644 --- a/samples/react-appinsights-usage/package.json +++ b/samples/react-appinsights-usage/package.json @@ -21,6 +21,7 @@ "@microsoft/sp-office-ui-fabric-core": "1.18.2", "@microsoft/sp-property-pane": "1.18.2", "@microsoft/sp-webpart-base": "1.18.2", + "@pnp/logging": "^4.0.1", "react": "17.0.1", "react-dom": "17.0.1", "tslib": "2.3.1" diff --git a/samples/react-appinsights-usage/src/webparts/pnPjsLogger/PnPjsLoggerWebPart.ts b/samples/react-appinsights-usage/src/webparts/pnPjsLogger/PnPjsLoggerWebPart.ts index 5fdee22c1..57ffcb1cf 100644 --- a/samples/react-appinsights-usage/src/webparts/pnPjsLogger/PnPjsLoggerWebPart.ts +++ b/samples/react-appinsights-usage/src/webparts/pnPjsLogger/PnPjsLoggerWebPart.ts @@ -11,6 +11,10 @@ import { IReadonlyTheme } from '@microsoft/sp-component-base'; import * as strings from 'PnPjsLoggerWebPartStrings'; import PnPjsLogger from './components/PnPjsLogger'; import { IPnPjsLoggerProps } from './components/IPnPjsLoggerProps'; +import { ApplicationInsights, DistributedTracingModes, ITelemetryItem } from '@microsoft/applicationinsights-web'; +import { ConsoleListener, LogLevel, Logger } from '@pnp/logging'; +import { AppInsightListener } from './listener/appinsight-loglistener'; +import { AIConnectionString } from '../../EnvProps'; export interface IPnPjsLoggerWebPartProps { description: string; @@ -20,7 +24,8 @@ export default class PnPjsLoggerWebPart extends BaseClientSideWebPart = React.createElement( PnPjsLogger, @@ -37,11 +42,57 @@ export default class PnPjsLoggerWebPart extends BaseClientSideWebPart { - return this._getEnvironmentMessage().then(message => { + const allAsynCalls = [] + allAsynCalls.push(this._getEnvironmentMessage().then(message => { this._environmentMessage = message; + }) + ) + + const userId: string = this.context.pageContext.user.loginName.replace(/([\\|:;=])/g, ''); + + // App Insights JS Documentation: https://github.com/microsoft/applicationinsights-js + this._appInsights = new ApplicationInsights({ + config: { + connectionString: AIConnectionString, + accountId: userId, + disableFetchTracking: false, + enableRequestHeaderTracking: true, + enableResponseHeaderTracking: true, + enableAjaxErrorStatusText: true, + enableAjaxPerfTracking: true, + enableUnhandledPromiseRejectionTracking: true, + enableCorsCorrelation: true, + disableExceptionTracking: false, + distributedTracingMode: DistributedTracingModes.AI + } + }); + + this._appInsights.loadAppInsights(); + this._appInsights.addTelemetryInitializer(this._appInsightsInitializer); + this._appInsights.setAuthenticatedUserContext(userId, userId, true); + this._appInsights.trackPageView(); + + Logger.subscribe(new AppInsightListener(this._appInsights)); + Logger.subscribe( ConsoleListener("pnpjs")); + Logger.activeLogLevel = LogLevel.Info; + + return Promise.all(allAsynCalls).then(() => { + return super.onInit(); }); } + private _appInsightsInitializer = (telemetryItem: ITelemetryItem): boolean | void => { + if (telemetryItem) { + if (!telemetryItem.tags) telemetryItem.tags = {}; + telemetryItem.tags['ai.cloud.role'] = "app-insights-spfx-webparts"; + telemetryItem.tags['ai.cloud.roleInstance'] = "PnPjsLoggerWebPart"; + + if (telemetryItem.baseType === 'RemoteDependencyData' && telemetryItem.baseData?.target) { + const isExcluded = telemetryItem.baseData.target.toLowerCase().indexOf('my_un_monitored_api ') !== -1; + if (isExcluded) return false; // don't track + } + } + } private _getEnvironmentMessage(): Promise { diff --git a/samples/react-appinsights-usage/src/webparts/pnPjsLogger/components/PnPjsLogger.tsx b/samples/react-appinsights-usage/src/webparts/pnPjsLogger/components/PnPjsLogger.tsx index 9b5a18233..f9683efae 100644 --- a/samples/react-appinsights-usage/src/webparts/pnPjsLogger/components/PnPjsLogger.tsx +++ b/samples/react-appinsights-usage/src/webparts/pnPjsLogger/components/PnPjsLogger.tsx @@ -2,9 +2,17 @@ import * as React from 'react'; import styles from './PnPjsLogger.module.scss'; import type { IPnPjsLoggerProps } from './IPnPjsLoggerProps'; import { escape } from '@microsoft/sp-lodash-subset'; +import { LogLevel, Logger } from '@pnp/logging'; +import { ActionButton } from '@fluentui/react'; export default class PnPjsLogger extends React.Component { + constructor(props: IPnPjsLoggerProps) { + super(props); + Logger.writeJSON(this.props, LogLevel.Info); + } public render(): React.ReactElement { + Logger.write("PnPjsLogger:Render", LogLevel.Info); + const { description, isDarkTheme, @@ -22,21 +30,23 @@ export default class PnPjsLogger extends React.Component
Web part property value: {escape(description)}
-

Welcome to SharePoint Framework!

-

- The SharePoint Framework (SPFx) is a extensibility model for Microsoft Viva, Microsoft Teams and SharePoint. It's the easiest way to extend Microsoft 365 with automatic Single Sign On, automatic hosting and industry standard tooling. -

-

Learn more about SPFx development:

-
+ ); } diff --git a/samples/react-appinsights-usage/src/webparts/pnPjsLogger/listener/appinsight-loglistener.ts b/samples/react-appinsights-usage/src/webparts/pnPjsLogger/listener/appinsight-loglistener.ts new file mode 100644 index 000000000..8c2ebcc6a --- /dev/null +++ b/samples/react-appinsights-usage/src/webparts/pnPjsLogger/listener/appinsight-loglistener.ts @@ -0,0 +1,22 @@ +import { ApplicationInsights, SeverityLevel } from "@microsoft/applicationinsights-web"; +import { ILogEntry, ILogListener, LogLevel } from "@pnp/logging"; + +export class AppInsightListener implements ILogListener { + private appInsights: ApplicationInsights; + constructor(appInsights: ApplicationInsights) { + this.appInsights = appInsights; + } + + log(entry: ILogEntry): void { + if (entry.level === LogLevel.Error) + this.appInsights.trackException({ error: new Error(entry.message), severityLevel: SeverityLevel.Error }); + else if (entry.level === LogLevel.Warning) + this.appInsights.trackException({ error: new Error(entry.message), severityLevel: SeverityLevel.Warning }); + else if (entry.level === LogLevel.Info) + this.appInsights.trackException({ error: new Error(entry.message), severityLevel: SeverityLevel.Information }); + else + this.appInsights.trackException({ error: new Error(entry.message), severityLevel: SeverityLevel.Verbose }); + } + + +}