OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 //------------------------------------------------------------------------------ | 5 //------------------------------------------------------------------------------ |
6 // Description of the life cycle of a instance of MetricsService. | 6 // Description of the life cycle of a instance of MetricsService. |
7 // | 7 // |
8 // OVERVIEW | 8 // OVERVIEW |
9 // | 9 // |
10 // A MetricsService instance is created at ChromeFrame startup in | 10 // A MetricsService instance is created at ChromeFrame startup in |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 } | 359 } |
360 | 360 |
361 //------------------------------------------------------------------------------ | 361 //------------------------------------------------------------------------------ |
362 // Recording control methods | 362 // Recording control methods |
363 | 363 |
364 void MetricsService::StartRecording() { | 364 void MetricsService::StartRecording() { |
365 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); | 365 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); |
366 if (log_manager_.current_log()) | 366 if (log_manager_.current_log()) |
367 return; | 367 return; |
368 | 368 |
| 369 MetricsLogManager::LogType log_type = (state_ == INITIALIZED) ? |
| 370 MetricsLogManager::INITIAL_LOG : MetricsLogManager::ONGOING_LOG; |
369 log_manager_.BeginLoggingWithLog(new MetricsLogBase(client_id_, session_id_, | 371 log_manager_.BeginLoggingWithLog(new MetricsLogBase(client_id_, session_id_, |
370 GetVersionString())); | 372 GetVersionString()), |
| 373 log_type); |
371 if (state_ == INITIALIZED) | 374 if (state_ == INITIALIZED) |
372 state_ = ACTIVE; | 375 state_ = ACTIVE; |
373 } | 376 } |
374 | 377 |
375 void MetricsService::StopRecording(bool save_log) { | 378 void MetricsService::StopRecording(bool save_log) { |
376 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); | 379 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); |
377 if (!log_manager_.current_log()) | 380 if (!log_manager_.current_log()) |
378 return; | 381 return; |
379 | 382 |
380 // Put incremental histogram deltas at the end of all log transmissions. | 383 // Put incremental histogram deltas at the end of all log transmissions. |
381 // Don't bother if we're going to discard current_log. | 384 // Don't bother if we're going to discard current_log. |
382 if (save_log) { | 385 if (save_log) { |
383 CrashMetricsReporter::GetInstance()->RecordCrashMetrics(); | 386 CrashMetricsReporter::GetInstance()->RecordCrashMetrics(); |
384 RecordCurrentHistograms(); | 387 RecordCurrentHistograms(); |
385 } | 388 } |
386 | 389 |
387 if (save_log) | 390 if (save_log) { |
388 log_manager_.StageCurrentLogForUpload(); | 391 log_manager_.FinishCurrentLog(); |
389 else | 392 log_manager_.StageNextLogForUpload(); |
| 393 } else { |
390 log_manager_.DiscardCurrentLog(); | 394 log_manager_.DiscardCurrentLog(); |
| 395 } |
391 } | 396 } |
392 | 397 |
393 void MetricsService::MakePendingLog() { | 398 void MetricsService::MakePendingLog() { |
394 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); | 399 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); |
395 if (log_manager_.has_staged_log()) | 400 if (log_manager_.has_staged_log()) |
396 return; | 401 return; |
397 | 402 |
398 switch (state_) { | 403 switch (state_) { |
399 case INITIALIZED: // We should be further along by now. | 404 case INITIALIZED: // We should be further along by now. |
400 DCHECK(false); | 405 DCHECK(false); |
401 return; | 406 return; |
402 | 407 |
403 case ACTIVE: | 408 case ACTIVE: |
404 StopRecording(true); | 409 StopRecording(true); |
405 StartRecording(); | 410 StartRecording(); |
406 break; | 411 break; |
407 | 412 |
408 default: | 413 default: |
409 DCHECK(false); | 414 DCHECK(false); |
410 return; | 415 return; |
411 } | 416 } |
412 | |
413 DCHECK(log_manager_.has_staged_log()); | |
414 } | 417 } |
415 | 418 |
416 bool MetricsService::TransmissionPermitted() const { | 419 bool MetricsService::TransmissionPermitted() const { |
417 // If the user forbids uploading that's their business, and we don't upload | 420 // If the user forbids uploading that's their business, and we don't upload |
418 // anything. | 421 // anything. |
419 return user_permits_upload_; | 422 return user_permits_upload_; |
420 } | 423 } |
421 | 424 |
422 // TODO(isherman): Update this to log to the protobuf server as well... | 425 // TODO(isherman): Update this to log to the protobuf server as well... |
423 // http://crbug.com/109817 | 426 // http://crbug.com/109817 |
424 bool MetricsService::UploadData() { | 427 bool MetricsService::UploadData() { |
425 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); | 428 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); |
426 | 429 |
427 if (!GetInstance()->TransmissionPermitted()) | 430 if (!GetInstance()->TransmissionPermitted()) |
428 return false; | 431 return false; |
429 | 432 |
430 static long currently_uploading = 0; | 433 static long currently_uploading = 0; |
431 if (InterlockedCompareExchange(¤tly_uploading, 1, 0)) { | 434 if (InterlockedCompareExchange(¤tly_uploading, 1, 0)) { |
432 DVLOG(1) << "Contention for uploading metrics data. Backing off"; | 435 DVLOG(1) << "Contention for uploading metrics data. Backing off"; |
433 return false; | 436 return false; |
434 } | 437 } |
435 | 438 |
436 MakePendingLog(); | 439 MakePendingLog(); |
437 DCHECK(log_manager_.has_staged_log()); | |
438 | 440 |
439 bool ret = true; | 441 bool ret = true; |
440 | 442 |
441 if (log_manager_.staged_log_text().empty()) { | 443 if (log_manager_.has_staged_log()) { |
442 NOTREACHED() << "Failed to compress log for transmission."; | |
443 ret = false; | |
444 } else { | |
445 HRESULT hr = ChromeFrameMetricsDataUploader::UploadDataHelper( | 444 HRESULT hr = ChromeFrameMetricsDataUploader::UploadDataHelper( |
446 log_manager_.staged_log_text().xml); | 445 log_manager_.staged_log_text().xml); |
447 DCHECK(SUCCEEDED(hr)); | 446 DCHECK(SUCCEEDED(hr)); |
| 447 log_manager_.DiscardStagedLog(); |
| 448 } else { |
| 449 NOTREACHED(); |
| 450 ret = false; |
448 } | 451 } |
449 log_manager_.DiscardStagedLog(); | |
450 | 452 |
451 currently_uploading = 0; | 453 currently_uploading = 0; |
452 return ret; | 454 return ret; |
453 } | 455 } |
454 | 456 |
455 // static | 457 // static |
456 std::string MetricsService::GetVersionString() { | 458 std::string MetricsService::GetVersionString() { |
457 chrome::VersionInfo version_info; | 459 chrome::VersionInfo version_info; |
458 if (version_info.is_valid()) { | 460 if (version_info.is_valid()) { |
459 std::string version = version_info.Version(); | 461 std::string version = version_info.Version(); |
460 // Add the -F extensions to ensure that UMA data uploaded by ChromeFrame | 462 // Add the -F extensions to ensure that UMA data uploaded by ChromeFrame |
461 // lands in the ChromeFrame bucket. | 463 // lands in the ChromeFrame bucket. |
462 version += "-F"; | 464 version += "-F"; |
463 if (!version_info.IsOfficialBuild()) | 465 if (!version_info.IsOfficialBuild()) |
464 version.append("-devel"); | 466 version.append("-devel"); |
465 return version; | 467 return version; |
466 } else { | 468 } else { |
467 NOTREACHED() << "Unable to retrieve version string."; | 469 NOTREACHED() << "Unable to retrieve version string."; |
468 } | 470 } |
469 | 471 |
470 return std::string(); | 472 return std::string(); |
471 } | 473 } |
OLD | NEW |