Beispiel #1
0
// 记录摘要信息
func recordSummary(
	scheduler scheduler.MKScheduler,
	detailSummary bool,
	record MKRecord,
	stopNotifier <-chan byte) {

	go func() {
		// 等待调度器开启
		waitForSchedulerStart(scheduler)

		// 准备
		var prevSchedulerSummary scheduler.SchedulerSummary
		var prevNumberGoroutine int
		var recordCount uint64 = 1
		startTime := time.Now()

		for {
			// 查看监控停止通知器
			select {
			case <-stopNotifier:
				return
			default:
			}

			// 获取摘要信息的各组成部分
			currentNumberGoroutine := runtime.NumGoroutine()
			currentSchedulerSummary := scheduler.Summary("	")

			// 比对前后两份摘要信息的一致性。只有不一致时才会予以记录
			if currentNumberGoroutine != prevNumberGoroutine ||
				!currentSchedulerSummary.Same(prevSchedulerSummary) {
				schedulerSummaryString := func() string {
					if detailSummary {
						return currentSchedulerSummary.Detail()
					} else {
						return currentSchedulerSummary.String()
					}
				}()

				// 记录摘要信息
				info := fmt.Sprintf(summaryForMonitoring,
					recordCount,
					currentNumberGoroutine,
					schedulerSummaryString,
					time.Since(startTime).String(),
				)

				record(0, info)

				prevNumberGoroutine = currentNumberGoroutine
				prevSchedulerSummary = currentSchedulerSummary
				recordCount++
			}

			time.Sleep(time.Microsecond)
		}
	}()
}