연습 - 포털에서 로깅 추가 및 Azure 함수 모니터링

완료됨

이전 단원에서는 Application Insights를 함수 애플리케이션에 통합할 때의 몇 가지 이점에 대해 알아보았습니다. 개발자 팀에서 사용할 수 있는 다른 로깅 기능 중 일부에 대해서도 알아보았습니다.

프로젝트 리서치의 이 단계에서 Maven을 사용하여 함수 애플리케이션을 Azure에 배포하고 프로덕션 환경에서 함수 애플리케이션을 테스트했습니다. 다음 작업은 추적 및 로깅 기능을 애플리케이션에 추가하는 것입니다.

이 연습에서는 로그 스트리밍과 Application Insights를 모두 지원하도록 함수 프로젝트 구성 파일을 업데이트합니다. 사용자 지정 추적 및 Application Insight 이벤트 트리거를 프로젝트 코드에 추가하는 방법도 알아봅니다.

실시간으로 로그 스트리밍

이제 함수 앱이 Azure에서 배포되고 실행되었으므로 간단한 Azure CLI 명령을 사용하여 앱에서 실시간 로그 스트리밍을 가져와 문제를 해결할 수 있습니다.

  1. Azure Portal의 HttpExample 함수에 대한 개요 페이지에 있습니다. 복사를 클립보드 아이콘으로 사용하여 리소스 그룹함수 앱의 값을 복사합니다.

  2. Azure Cloud Shell 창에서 로그를 az webapp log tail -n <functionAppName> -g <resourceGroup> 스트리밍하는 명령을 입력합니다. 이전 단계에서 저장한 값으로 대체 <functionAppName> 합니다 <resourceGroup> . 예시:

    az webapp log tail -n event-reporting-20240125192009873 -g learn-f0af729c-0493-4b45-a5b8-d6b4783b03da
    
    
  3. 다음 메시지와 같은 출력이 표시됩니다.

    2024-01-25T20:44:58  Welcome, you are now connected to log-streaming service. The default timeout is 2 hours. Change the timeout with the App Setting SCM_LOGSTREAM_TIMEOUT (in seconds). 
    2024-01-25T20:45:58  No new trace in the past 1 min(s).
    
  4. 웹 브라우저에서 새 탭을 열고 이전 연습에서 완전히 생성된 URL을 붙여넣어 함수 앱에 액세스하여 일부 로그를 생성합니다.

  5. 테스트를 마쳤으면 Cloud Shell에서 Ctrl+C를 눌러 로그 스트림을 닫습니다.

Application Insights에 대한 Java 프로젝트에 계측 추가

이제 애플리케이션에 Application Insights를 사용하도록 설정했으므로 다음 작업으로 애플리케이션에서 사용하도록 설정합니다. 애플리케이션 로깅 및 Application Insights를 사용하도록 설정하려면 필수 라이브러리 및 기타 종속성을 포함하도록 구성 파일을 수정해야 합니다.

업데이트해야 하는 두 가지 구성 파일인 pom.xml 및 host.json.

‘pom.xml’ 파일 수정

  1. Azure Cloud Shell을 사용하여 디렉터리를 프로젝트의 루트로 변경합니다.

    cd ~/event-reporting
    
  2. Cloud Shell의 코드 편집기를 사용하여 ‘pom.xml’ 파일을 엽니다.

    code pom.xml
    
  3. 독립 실행형 <dependencies> 섹션에 다음 요소를 추가하여 애플리케이션에 Application Insights를 사용하도록 설정합니다.

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>applicationinsights-web-auto</artifactId>
        <version>2.6.0</version>
    </dependency>
    

    참고 항목

    Application Instights의 <dependency><dependencyManagement> 요소 내에 포함된 <dependencies> 컬렉션이 아니라 독립 실행형 <dependencies> 컬렉션에 추가해야 합니다.

  4. Ctrl+S를 눌러서 ‘pom.xml’ 파일을 저장하고 Ctrl+Q를 눌러서 코드 편집기를 닫습니다.

‘host.json’ 파일 수정

  1. Cloud Shell의 코드 편집기를 사용하여 ‘host.json’ 파일을 엽니다.

    code host.json
    
  2. 기존 JSON 코드를 제거하고 다음 설정으로 바꿉니다.

    {
        "version": "2.0",
        "extensionBundle": {
            "id": "Microsoft.Azure.Functions.ExtensionBundle",
            "version": "[1.*, 2.0.0)"
        },
        "logging": {
            "fileLoggingMode": "always",
            "logLevel": {
                "default": "Information"
            }
        },
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "maxTelemetryItemsPerSecond" : 5
            }
        }
    }
    

    extensionBundle에 대한 설정은 이미 정의되었지만 loggingapplicationInsights는 해당 기능에 대한 다양한 설정을 정의합니다.

  3. Ctrl+S를 눌러서 host.json 파일을 저장하고 Ctrl+Q를 눌러서 코드 편집기를 닫습니다.

프로젝트 코드에 로깅 및 Application Insights 추적 추가

로그 파일에 표시되는 Application Insights에서 수집한 데이터의 유용성을 향상하려면 애플리케이션 코드에 몇 가지 데이터 로깅 명령을 추가해야 합니다.

‘Function.java’ 파일에 로깅 추가

함수에 일반 로깅을 추가하려면 애플리케이션 코드의 주요 지점에 다음 예제와 같은 코드를 추가할 수 있습니다. 여기서 문자열을 애플리케이션의 로그 파일에 표시하려는 메시지로 바꿉 [LOG MESSAGE] 니다.

context.getLogger().info("[LOG MESSAGE]");

애플리케이션에 로깅을 추가하려면 다음 단계를 수행합니다.

  1. Cloud Shell 편집기에서 애플리케이션의 ‘Function.java’ 파일을 엽니다.

    code ~/event-reporting/src/main/java/com/contoso/functions/Function.java
    

    기존 코드를 검사하면 기존 context.getLogger() 명령이 있음을 알 수 있습니다. 함수 정의 run() 후 첫 번째 명령입니다.

  2. 빈 GET 쿼리 문자열 또는 빈 POST 요청이 있는지 테스트하는 다음 코드 섹션을 찾습니다.

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
    } else {
        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
    
  3. 해당 코드 섹션을 수정하여 로깅 시스템으로 함수 상태를 출력하는 두 개의 context.getLogger() 명령이 포함되도록 합니다.

    if (name == null) {
        context.getLogger().info("Execution failure - Incorrect or missing parameter used.");
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
    } else {
        context.getLogger().info("Execution success - name parameter = " + name);
        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
    
  4. Ctrl+S를 눌러 Function.java 파일을 저장하지만 편집기를 닫지 마세요. 이 연습의 다음 섹션에서 애플리케이션에 코드를 추가합니다.

‘Function.java’ 파일에 Application Insights 추적 추가

  1. 다음 import 문을 기존 가져오기 세트에 추가합니다. 이 문은 Application Insights 원격 분석 라이브러리를 가져옵니다.

    import com.microsoft.applicationinsights.TelemetryClient;
    
  2. 애플리케이션의 Function() 클래스에 다음 정의를 추가합니다. 이 문은 TelemetryClient 개체를 인스턴스화합니다.

    private TelemetryClient telemetry = new TelemetryClient();
    
  3. context.getLogger() 문을 복사하고 코드를 수정하여 각 중복 항목이 context.getLogger() 대신 telemetry.trackEvent()를 호출하도록 합니다.

    . . .
    context.getLogger().info("Java HTTP trigger processed a request.");
    telemetry.trackEvent("Java HTTP trigger processed a request.");
    
    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);
    
    if (name == null) {
        context.getLogger().info("Execution failure - Incorrect or missing parameter used.");
        telemetry.trackEvent("Execution failure - Incorrect or missing parameter used.");
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
    } else {
        context.getLogger().info("Execution success - name parameter = " + name);
        telemetry.trackEvent("Execution success - name parameter = " + name);
        return request.createResponseBuilder(HttpStatus.OK).body("Hi, " + name).build();
    }
    . . .
    
  4. Ctrl+S를 눌러서 Function.java 파일을 저장하고 Ctrl+Q를 눌러서 코드 편집기를 닫습니다.

  5. 마지막으로 수행할 작업은 함수 애플리케이션을 빌드, 패키징, 재배포하는 것입니다.

    cd ~/event-reporting
    mvn clean package azure-functions:deploy
    

이제 로깅 및 Application Insights 데이터 수집이 함수에 추가됩니다.

Application Insights를 사용하여 Azure 함수 모니터링

이제 시스템 로거와 Application Insights를 둘 다 사용하여 세분화된 로깅을 지원하도록 애플리케이션이 업데이트되었습니다.

  1. 일부 샘플 HTTP 트래픽을 생성하려면 이전 연습에서 웹 브라우저에서 애플리케이션을 테스트하는 데 사용한 URL을 복사합니다. cURL과 함께 해당 URL을 사용하여 Azure Cloud Shell에서 루프를 만듭니다. 예를 들어:

    while :; do curl https://event-reporting-20200102030405006.azurewebsites.net/api/HttpExample?name=Bob; sleep 1; done
    
  2. 샌드박스를 활성화하는 데 사용한 것과 동일한 계정으로 Azure Portal에 로그인합니다.

  3. 왼쪽 메뉴에서 모든 리소스를 선택합니다.

  4. 리소스 목록에서 함수를 선택합니다. 이 연습에서는 함수 이름이 ‘event-reporting’으로 시작합니다. 예를 들어 ‘event-reporting-20200102030405006’입니다.

  5. 로그 스트리밍 작업을 봅니다.

    1. 함수 앱 메뉴에서 로그 스트림선택합니다.

    2. App Insights 로그 드롭다운을 열고 파일 시스템 로그를 선택합니다.

      Image showing where to find Log Streaming.

    3. 샘플 트래픽은 일련의 로그 항목을 생성합니다.

      Image showing Log Streaming.

  6. 라이브 메트릭 작업을 봅니다.

    1. 파일 시스템 로그 드롭다운을 선택하고 App Insights 로그를 선택합니다.

    2. 라이브 메트릭에서 열기를 선택합니다. 이제 샘플 트래픽이 Application Insights 및 라이브 메트릭 결과를 생성하는 것을 볼 수 있습니다.

      Image showing Application Insights and Live Metrics highlights.

축하합니다. 자세한 로깅을 위해 Azure Function을 성공적으로 구성했습니다.

계속하기 전에 Cloud Shell로 다시 전환한 후 Ctrl+C를 눌러 명령 루프를 닫습니다.