Monitorowanie witryny programu SharePoint za pomocą usługi Application Insights
Usługa Application Insights monitoruje dostępność, wydajność i użycie aplikacji. W tym artykule pokazano, jak skonfigurować ją dla witryny programu SharePoint.
Uwaga
Ze względu na obawy dotyczące zabezpieczeń nie można bezpośrednio dodać skryptu opisanego w tym artykule do stron internetowych w nowoczesnym środowisku użytkownika programu SharePoint. Alternatywnie możesz użyć SharePoint Framework (SPFx) do utworzenia rozszerzenia niestandardowego, którego można użyć do zainstalowania usługi Application Insights w witrynach programu SharePoint.
Tworzenie zasobu usługi Application Insights
W witrynie Azure Portal utwórz nowy zasób usługi Application Insights. W polu Typ aplikacji wybierz pozycję ASP.NET.
Otwarte okno to miejsce, w którym są wyświetlane dane dotyczące wydajności i użycia aplikacji. Następnym razem, gdy zalogujesz się do platformy Azure, zostanie wyświetlony kafelek na ekranie startowym . Alternatywnie wybierz pozycję Przeglądaj , aby go znaleźć.
Dodawanie skryptu do stron internetowych
Poniższy bieżący fragment kodu to wersja "5"
. Wersja jest zakodowana w fragmencie kodu jako sv:"#"
. Bieżąca wersja jest również dostępna w usłudze GitHub.
<!--
To collect user behavior analytics tools about your application,
insert the following script into each page you want to track.
Place this code immediately before the closing </head> tag,
and before any other scripts. Your first data will appear
automatically in just a few seconds.
-->
<script type="text/javascript">
!function(T,l,y){var S=T.location,k="script",D="instrumentationKey",C="ingestionendpoint",I="disableExceptionTracking",E="ai.device.",b="toLowerCase",w="crossOrigin",N="POST",e="appInsightsSDK",t=y.name||"appInsights";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:"5",version:2,config:d};function v(e,t){var n={},a="Browser";return n[E+"id"]=a[b](),n[E+"type"]=a,n["ai.operation.name"]=S&&S.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=""+e;return 1===t.length&&(t="0"+t),t}return e.getUTCFullYear()+"-"+t(1+e.getUTCMonth())+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+((e.getUTCMilliseconds()/1e3).toFixed(3)+"").slice(2,5)+"Z"}(),iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(";"),a=0;a<n.length;a++){var i=n[a].split("=");2===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]="https://"+(o?o+".":"")+"dc."+(r||"services.visualstudio.com")}return e}(),c=s[D]||d[D]||"",u=s[C],p=u?u+"/v2/track":d.endpointUrl,(l=[]).push((n="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",a=t,i=p,(o=(r=v(c,"Exception")).data).baseType="ExceptionData",o.baseData.exceptions=[{typeName:"SDKLoadFailed",message:n.replace(/\./g,"-"),hasFullStack:!1,stack:n+"\nSnippet failed to load ["+a+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(S&&S.pathname||"_unknown_")+"\nEndpoint: "+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,"Message"),r=i.data;r.baseType="MessageData";var o=r.baseData;return o.message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+n+")").replace(/\"/g,"")+'"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:"cors"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader("Content-type","application/json"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&""!==e||"undefined"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName("head")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n="track",r="TrackPage",o="TrackEvent";t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+r,"stop"+r,"start"+o,"stop"+o,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c="onerror";t(["_"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m["_"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{
src: "https://js.monitor.azure.com/scripts/b/ai.2.gbl.min.js", // The SDK URL Source
// name: "appInsights", // Global SDK Instance name defaults to "appInsights" when not supplied
// ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,
// useXhr: 1, // Use XHR instead of fetch to report failures (if available),
crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag
// onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)
cfg: { // Application Insights Configuration
instrumentationKey:"INSTRUMENTATION_KEY"
}});
</script>
Uwaga
Adres URL programu SharePoint używa innego formatu "...\ai.2.gbl.min.js"
modułu (zwróć uwagę na dodatkowy .gbl
format ). Ten alternatywny format modułu jest wymagany, aby uniknąć problemu spowodowanego kolejnością ładowania skryptów. Problem powoduje niepowodzenie inicjowania zestawu SDK i powoduje utratę zdarzeń telemetrii.
Problem jest spowodowany requireJS
załadowaniem i zainicjowaniem go przed zestawem SDK.
Wstaw skrypt przed tagiem </head> każdej strony, którą chcesz śledzić. Jeśli witryna internetowa ma stronę główną, możesz umieścić tam skrypt. Na przykład w projekcie ASP.NET MVC należy umieścić go w View\Shared\_Layout.cshtml
pliku .
Skrypt zawiera klucz instrumentacji, który kieruje dane telemetryczne do zasobu usługi Application Insights.
Dodawanie kodu do stron witryny
Możesz dodać kod do strony głównej lub poszczególnych stron.
Strona główna
Jeśli możesz edytować stronę główną witryny, możesz zapewnić monitorowanie każdej strony w witrynie.
Zapoznaj się ze stroną główną i edytuj ją przy użyciu programu SharePoint Designer lub dowolnego innego edytora.
Dodaj kod przed tagiem .
Uwaga
31 marca 2025 r. zostanie zakończone świadczenie pomocy technicznej dla pozyskiwania klucza instrumentacji. Pozyskiwanie klucza instrumentacji będzie nadal działać, ale nie udostępnimy już aktualizacji ani obsługi funkcji. Przejście do parametrów połączenia w celu skorzystania z nowych możliwości.
Poszczególne strony
Aby monitorować ograniczony zestaw stron, dodaj skrypt oddzielnie do każdej strony.
Wstaw składnik Web Part i osadź w nim fragment kodu.
Wyświetlanie danych aplikacji
Ponownie wdróż aplikację.
Wróć do okienka aplikacji w Azure Portal.
Pierwsze zdarzenia są wyświetlane w obszarze Wyszukaj.
Wybierz pozycję Odśwież po kilku sekundach, jeśli oczekujesz większej ilości danych.
Przechwytywanie identyfikatora użytkownika
Standardowy fragment kodu strony internetowej nie przechwytuje identyfikatora użytkownika z programu SharePoint, ale można to zrobić przy użyciu niewielkiej modyfikacji.
Skopiuj klucz instrumentacji aplikacji z listy rozwijanej Essentials w usłudze Application Insights.
Zastąp klucz instrumentacji dla
XXXX
elementu w poniższym fragmencie kodu.Osadź skrypt w aplikacji programu SharePoint zamiast fragmentu kodu pobranego z portalu.
<SharePoint:ScriptLink ID="ScriptLink1" name="SP.js" runat="server" localizable="false" loadafterui="true" /> <SharePoint:ScriptLink ID="ScriptLink2" name="SP.UserProfiles.js" runat="server" localizable="false" loadafterui="true" /> <script type="text/javascript"> var personProperties; // Ensure that the SP.UserProfiles.js file is loaded before the custom code runs. SP.SOD.executeOrDelayUntilScriptLoaded(getUserProperties, 'SP.UserProfiles.js'); function getUserProperties() { // Get the current client context and PeopleManager instance. var clientContext = new SP.ClientContext.get_current(); var peopleManager = new SP.UserProfiles.PeopleManager(clientContext); // Get user properties for the target user. // To get the PersonProperties object for the current user, use the // getMyProperties method. personProperties = peopleManager.getMyProperties(); // Load the PersonProperties object and send the request. clientContext.load(personProperties); clientContext.executeQueryAsync(onRequestSuccess, onRequestFail); } // This function runs if the executeQueryAsync call succeeds. function onRequestSuccess() { var appInsights=window.appInsights||function(config){ function s(config){t[config]=function(){var i=arguments;t.queue.push(function(){t[config].apply(t,i)})}}var t={config:config},r=document,f=window,e="script",o=r.createElement(e),i,u;for(o.src=config.url||"//az416426.vo.msecnd.net/scripts/a/ai.0.js",r.getElementsByTagName(e)[0].parentNode.appendChild(o),t.cookie=r.cookie,t.queue=[],i=["Event","Exception","Metric","PageView","Trace"];i.length;)s("track"+i.pop());return config.disableExceptionTracking||(i="onerror",s("_"+i),u=f[i],f[i]=function(config,r,f,e,o){var s=u&&u(config,r,f,e,o);return s!==!0&&t["_"+i](config,r,f,e,o),s}),t }({ instrumentationKey:"XXXX" }); window.appInsights=appInsights; appInsights.trackPageView(document.title,window.location.href, {User: personProperties.get_displayName()}); } // This function runs if the executeQueryAsync call fails. function onRequestFail(sender, args) { } </script>
Następne kroki
- Zobacz Omówienie dostępności , aby monitorować dostępność witryny.
- Zobacz Application Insights , aby zapoznać się z innymi typami aplikacji.