다음을 통해 공유


자습서: Application Insights를 사용하여 Service Fabric 애플리케이션 모니터링 및 진단

이 자습서는 시리즈의 5부입니다. Application Insights를 사용하여 Azure Service Fabric 클러스터에서 실행되는 ASP.NET Core 애플리케이션에 대한 모니터링 및 진단을 구성하는 단계를 안내합니다. 자습서 시리즈 1부에서 개발된 애플리케이션에서 원격 분석을 수집합니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • Application Insights 리소스 설정
  • 애플리케이션의 서비스에 Application Insights 추가
  • Application Insights에서 원격 분석 및 애플리케이션 맵 보기
  • 애플리케이션에 사용자 지정 계측 추가

이 자습서 시리즈에서는 다음을 수행하는 방법을 보여 줍니다.

필수 조건

이 자습서를 시작하기 전에:

투표 애플리케이션 예제 다운로드

이 자습서 시리즈의 1부에서 투표 애플리케이션 샘플을 빌드하지 않은 경우 다운로드할 수 있습니다. 명령 창 또는 터미널에서 다음 명령을 실행하여 로컬 컴퓨터에 샘플 앱 리포지토리를 복제합니다.

git clone https://github.com/Azure-Samples/service-fabric-dotnet-quickstart

Application Insights 리소스 설정

Application Insights는 Azure 애플리케이션 성능 관리 플랫폼입니다. Service Fabric에서 애플리케이션 모니터링 및 진단에 Application Insights를 사용하는 것이 좋습니다.

Application Insights 리소스를 만들려면 Azure Portal로 이동합니다. 리소스 만들기를 선택합니다. 포털 메뉴에서 모니터링 + 진단을 선택합니다. 인기 Azure 서비스 열의 Application Insights 아래에서 만들기를 선택합니다.

새 Application Insights 리소스를 만드는 방법을 보여 주는 스크린샷.

구독, 리소스 그룹이름 값을 입력하거나 선택합니다. 지역의 경우 나중에 Service Fabric 클러스터를 배포할 위치를 선택합니다. 이 자습서에서는 로컬 클러스터에 앱을 배포하므로 Azure 지역은 관련이 없습니다. 애플리케이션 유형의 경우 ASP.NET 웹 애플리케이션으로 그대로 둡니다.

Application Insights 리소스 특성을 보여 주는 스크린샷.

필요한 정보를 입력하거나 선택하면 만들기를 선택하여 리소스를 프로비전합니다. 리소스는 약 1분 안에 배포됩니다.

애플리케이션의 서비스에 Application Insights 추가

관리자 권한으로 실행 옵션을 사용하여 Visual Studio 2019를 엽니다(시작 메뉴에서 Visual Studio 아이콘을 마우스 오른쪽 단추로 클릭). 파일>열기>프로젝트/솔루션을 차례로 선택하고, 자습서의 1부에서 만들었거나 GitHub에서 복제된 투표 애플리케이션으로 이동합니다. Voting.sln 파일을 엽니다. 애플리케이션의 NuGet 패키지를 복원하라는 메시지가 표시되면 를 선택합니다.

VotingWeb 및 VotingData 서비스에 대한 Application Insights를 구성하려면:

  1. 마우스 오른쪽 단추로 서비스 이름을 클릭하고, 추가>연결된 서비스>Application Insights를 사용하여 모니터링을 차례로 선택합니다.

    Application Insights 서비스 구성을 보여 주는 스크린샷.

    참고 항목

    프로젝트 유형에 따라 서비스 이름을 마우스 오른쪽 단추로 클릭할 때 추가를 선택한 다음, Application Insights 원격 분석을 선택해야 할 수 있습니다.

  2. 시작하기를 선택합니다.

  3. Azure 구독에 사용하는 계정에 로그인하고, Application Insights 리소스를 만든 구독을 선택합니다. 리소스를 찾으려면 리소스에서 기존 Application Insights 리소스로 이동합니다. 등록을 선택하여 Application Insights를 서비스에 추가합니다.

    Application Insights를 등록하는 방법을 보여 주는 스크린샷.

  4. 완료를 선택합니다.

참고 항목

애플리케이션에서 서비스 둘 다에 대해 이러한 단계를 수행하여 애플리케이션에 대한 Application Insights 구성을 마쳐야 합니다. 들어오고 나가는 요청 및 서비스 간의 통신을 확인하기 위해 서비스 둘 다에 동일한 Application Insights 리소스가 사용됩니다.

서비스에 Microsoft.ApplicationInsights.ServiceFabric.Native NuGet 추가

Application Insights에는 시나리오에 따라 사용할 수 있는 두 개의 Service Fabric 특정 NuGet 패키지가 있습니다. 하나는 Service Fabric 네이티브 서비스에 사용되고, 다른 하나는 컨테이너 및 게스트 실행 파일에 사용됩니다. 이 경우 Microsoft.ApplicationInsights.ServiceFabric.Native NuGet 패키지를 사용하여 서비스 컨텍스트에 대해 알아봅니다. Application Insights SDK 및 Service Fabric 특정 NuGet 패키지에 대한 자세한 내용은 Service Fabric용 Microsoft Application Insights를 참조하세요.

NuGet 패키지를 설정하려면:

  1. 솔루션 탐색기에서 솔루션 '투표'를 마우스 오른쪽 단추로 클릭하고 솔루션에 대한 NuGet 패키지 관리를 선택합니다.

  2. NuGet - 솔루션 대화 상자에서 찾아보기를 선택합니다. 시험판 포함 확인란을 선택합니다.

    참고 항목

    Application Insights 패키지를 설치하기 전에 사전 설치되지 않은 경우 Microsoft.ServiceFabric.Diagnostics.Internal 패키지를 동일한 방식으로 설치해야 할 수 있습니다.

  3. Microsoft.ApplicationInsights.ServiceFabric.Native를 검색한 다음, NuGet 패키지를 선택합니다.

  4. 오른쪽 창에서 VotingWeb 확인란과 VotingData 확인란을 선택합니다. 설치를 선택합니다.

    NuGet의 Application Insights SDK를 보여 주는 스크린샷.

  5. 변경 내용 미리 보기 대화 상자에서 확인을 선택하여 라이선스를 수락합니다. NuGet 패키지가 서비스에 추가됩니다.

  6. 다음으로 두 서비스에서 원격 분석 이니셜라이저를 설정해야 합니다. VotingWeb.csVotingData.cs를 엽니다. 두 코드 파일에서 다음 단계를 완료합니다.

    1. 기존 using 문 뒤에 각 파일의 맨 위에 다음 두 using 문을 추가합니다.

      using Microsoft.ApplicationInsights.Extensibility;
      using Microsoft.ApplicationInsights.ServiceFabric;
      
    2. 두 파일 모두 CreateServiceInstanceListeners() 또는 CreateServiceReplicaListeners()의 중첩된 return 문에서 ConfigureServices>services 아래에 다른 싱글톤 서비스가 선언되어 있으면 다음을 추가합니다.

      .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
      

      이 코드는 원격 분석에 Service Context를 추가하므로 Application Insights에서 원격 분석의 원본을 더 잘 이해할 수 있습니다. 이제 VotingWeb.cs의 중첩된 return 문은 다음 예제와 유사합니다.

      return new WebHostBuilder()
          .UseKestrel()
          .ConfigureServices(
              services => services
                  .AddSingleton<HttpClient>(new HttpClient())
                  .AddSingleton<FabricClient>(new FabricClient())
                  .AddSingleton<StatelessServiceContext>(serviceContext)
                  .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
          .UseContentRoot(Directory.GetCurrentDirectory())
          .UseStartup<Startup>()
          .UseApplicationInsights()
          .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
          .UseUrls(url)
          .Build();
      

VotingData.cs에서 코드는 이제 다음 예제와 유사합니다.

return new WebHostBuilder()
    .UseKestrel()
    .ConfigureServices(
        services => services
            .AddSingleton<StatefulServiceContext>(serviceContext)
            .AddSingleton<IReliableStateManager>(this.StateManager)
            .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseStartup<Startup>()
    .UseApplicationInsights()
    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
    .UseUrls(url)
    .Build();

예제와 같이 UseApplicationInsights() 메서드가 VotingWeb.csVotingData.cs 파일 둘 다에서 호출되는지 다시 확인합니다.

참고 항목

이 샘플 앱은 서비스 통신을 위해 HTTP를 사용합니다. Service Fabric Service Remoting V2를 사용하여 앱을 개발하는 경우 코드의 동일한 위치에 다음 줄도 추가합니다.

ConfigureServices(services => services
    ...
    .AddSingleton<ITelemetryModule>(new ServiceRemotingDependencyTrackingTelemetryModule())
    .AddSingleton<ITelemetryModule>(new ServiceRemotingRequestTrackingTelemetryModule())
)

이제 애플리케이션을 배포할 준비가 되었습니다. 시작(또는 F5 키 선택)을 선택합니다. Visual Studio는 애플리케이션을 빌드 및 패키지하고, 로컬 클러스터를 설정하고, 애플리케이션을 클러스터에 배포합니다.

참고 항목

최신 버전의 .NET Core SDK가 설치되지 않은 경우 빌드 오류가 발생할 수 있습니다.

애플리케이션이 배포되면 투표 샘플 단일 페이지 애플리케이션이 실행되는 localhost:8080으로 이동합니다. 다른 몇 가지 선택 항목에 투표하여 일부 샘플 데이터와 원격 분석을 만듭니다. 예를 들어, 디저트가 있습니다!

디저트 유형에 대한 투표 예제를 보여 주는 스크린샷.

또한 몇 가지 투표 추가가 완료되면 일부 투표 옵션을 제거할 수 있습니다.

Application Insights에서 원격 분석 및 애플리케이션 맵 보기

Azure Portal에서, Application Insights 리소스로 이동합니다.

개요를 선택하여 리소스의 개요 창으로 돌아갑니다. 검색을 선택하여 들어오는 추적을 확인합니다. 추적이 Application Insights에 나타나는 데 몇 분 정도 걸립니다. 추적이 표시되지 않으면 잠시 기다린 다음 새로 고침 단추를 선택합니다.

Application Insights에 추적 보기를 보여 주는 스크린샷.

Application Insights와 함께 제공되는 모든 들어오는 원격 분석을 보려면 검색 창에서 아래로 스크롤합니다. Voting 애플리케이션에서 수행한 각 작업에 대해 VotingWeb에서 나가는 PUT 요청(PUT Votes/Put [name]), VotingData에서 들어오는 PUT 요청(PUT VoteData/Put [name]), 표시되는 데이터 새로 고침에 대한 GET 요청 쌍이 있어야 합니다. 또한 이러한 요청은 HTTP 요청이므로 localhost의 HTTP에 대한 종속성 추적이 있습니다. 다음은 한 표가 추가되는 방식에 대해 표시되는 내용의 예입니다.

Application Insights의 샘플 요청 추적을 보여 주는 스크린샷.

추적을 선택하여 자세한 내용을 볼 수 있습니다. Application Insights에는 응답 시간요청 URL 값을 포함하여 요청에 대한 유용한 정보가 포함되어 있습니다. Service Fabric 특정 NuGet를 추가했으므로 사용자 지정 데이터 섹션의 Service Fabric 클러스터 컨텍스트에서 애플리케이션에 대한 데이터가 제공됩니다. 데이터에는 서비스 컨텍스트가 포함되므로 요청 원본의 PartitionIDReplicaId 값을 확인하고, 애플리케이션의 오류를 진단할 때 문제를 더 잘 격리할 수 있습니다.

Application Insights 추적 세부 정보를 보여 주는 스크린샷.

애플리케이션 맵으로 이동하려면 개요 창의 리소스 메뉴에서 애플리케이션 맵을 선택하거나 앱 맵 아이콘을 선택합니다. 맵은 연결된 두 서비스를 보여 줍니다.

리소스 메뉴에서 애플리케이션 맵을 강조 표시하는 스크린샷.

애플리케이션 맵은 특히 함께 작동하는 서비스를 추가하기 시작할 때 애플리케이션 토폴로지의 이해를 높이는 데 도움이 될 수 있습니다. 또한 요청 성공률에 대한 기본 데이터를 제공하며, 문제가 발생한 위치를 파악하기 위해 실패한 요청을 진단하는 데 유용할 수 있습니다. 자세한 내용은 Application Insights의 애플리케이션 맵을 참조하세요.

애플리케이션에 사용자 지정 계측 추가

Application Insights는 기본적으로 원격 분석 데이터를 제공하지만 사용자 지정 계측을 추가하는 것이 좋습니다. 사용자 지정 계측에 대한 비즈니스 요구 사항이 있거나 애플리케이션에서 문제가 발생할 경우 진단을 개선하려고 할 수 있습니다. Application Insights API를 사용하여 사용자 지정 이벤트 및 메트릭을 수집할 수 있습니다.

다음으로, VoteDataController.cs(VotingData>Controllers)에 일부 사용자 지정 이벤트를 추가하여 기본 votesDictionary에서 투표가 추가 및 삭제되는 시기를 추적합니다.

  1. 다른 using 문의 끝에 using Microsoft.ApplicationInsights;를 추가합니다.

  2. 클래스 시작에서 IReliableStateManager 생성 아래에 TelemetryClient에 대한 새 값을 선언합니다. private TelemetryClient telemetry = new TelemetryClient();.

  3. Put() 함수에서 투표가 추가됨을 확인하는 이벤트를 추가합니다. 트랜잭션이 완료된 후 return OkResult 문 바로 앞에 telemetry.TrackEvent($"Added a vote for {name}");을 추가합니다.

  4. Delete()에는 votesDictionary에 특정 투표 옵션에 대한 투표가 포함되어 있다는 조건에 따른 "if/else"가 있습니다.

    1. await tx.CommitAsync() 다음에 if 문에서 투표 삭제를 확인하는 이벤트를 추가합니다. telemetry.TrackEvent($"Deleted votes for {name}");
    2. return 문 앞에 else 문에서 삭제가 수행되지 않았음을 표시하는 이벤트를 추가합니다. telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

다음은 이벤트를 추가한 후 Put()Delete() 함수가 어떻게 보일지에 대한 예입니다.

// PUT api/VoteData/name
[HttpPut("{name}")]
public async Task<IActionResult> Put(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        await votesDictionary.AddOrUpdateAsync(tx, name, 1, (key, oldvalue) => oldvalue + 1);
        await tx.CommitAsync();
    }

    telemetry.TrackEvent($"Added a vote for {name}");
    return new OkResult();
}

// DELETE api/VoteData/name
[HttpDelete("{name}")]
public async Task<IActionResult> Delete(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        if (await votesDictionary.ContainsKeyAsync(tx, name))
        {
            await votesDictionary.TryRemoveAsync(tx, name);
            await tx.CommitAsync();
            telemetry.TrackEvent($"Deleted votes for {name}");
            return new OkResult();
        }
        else
        {
            telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");
            return new NotFoundResult();
        }
    }
}

이러한 변경 작업을 마치면 애플리케이션에서 시작을 선택하여 최신 버전을 빌드하고 배포합니다. 애플리케이션 배포가 완료되면 localhost:8080으로 이동합니다. 일부 투표 옵션을 추가하고 삭제합니다. 그런 다음, Application Insights 리소스로 돌아가서 최신 실행에 대한 추적을 확인합니다(추적이 Application Insights에 표시되는 데 1~2분 정도 걸릴 수 있음). 추가 및 삭제한 모든 투표의 경우 이제 연결된 응답 원격 분석과 사용자 지정 이벤트에 대한 항목이 표시됩니다.

사용자 지정 이벤트를 보여 주는 스크린샷.